Compare commits

..

1 Commits

Author SHA1 Message Date
ma0048 027e5da20d leitfäden verlinkung im bewerbungstool entfernt 2025-11-20 14:18:54 +01:00
89 changed files with 664 additions and 3149 deletions
+1 -6
View File
@@ -61,11 +61,7 @@ $config['tabs'] =
'notes' => [
//if true, the count of Messages will be shown in the header of the Tab Messages
'showCountNotes' => true
],
'combinePeople' => [
//multitab should only be shown with this length of selection
'validCountMulti' => 2,
],
]
];
// List of fields to show when ZGV_DOKTOR_ANZEIGEN is defined
@@ -121,6 +117,5 @@ $config['students_tab_order'] = [
'status',
'groups',
'finalexam',
'combinePeople',
'archive',
];
+1 -1
View File
@@ -14,7 +14,7 @@ class Pub extends Auth_Controller
{
parent::__construct(
array(
'bild' => ['basis/cis:r', 'assistenz:r']
'bild' => ['basis/cis:r']
)
);
}
@@ -119,19 +119,7 @@ class Lehrveranstaltung extends FHCAPI_Controller
if (hasData($lehreinheiten_data))
{
$lehreinheiten = getData($lehreinheiten_data);
if (!isset($row->_children))
{
$row->_children = $lehreinheiten;
}
else
{
if (!is_array($row->_children))
{
$row->_children = [$row->_children];
}
$row->_children = array_merge($row->_children, $lehreinheiten);
}
$rowData->_children = $lehreinheiten;
}
if (!isEmptyString($row->studienplan_lehrveranstaltung_id_parent))
@@ -12,8 +12,8 @@ class Gruppe extends FHCAPI_Controller
'add' => ['admin:rw', 'assistenz:rw'],
'delete' => ['admin:rw', 'assistenz:rw'],
'deleteFromLVPlan' => ['admin:rw', 'assistenz:rw'],
'getBenutzerSearch' => ['admin:r', 'assistenz:r'],
'getAllSearch' => ['admin:r', 'assistenz:r'],
'getBenutzer' => ['admin:r', 'assistenz:r'],
'getAll' => ['admin:r', 'assistenz:r'],
'getByLehreinheit' => ['admin:r', 'assistenz:r'],
]);
@@ -22,8 +22,7 @@ class Gruppe extends FHCAPI_Controller
$this->_ci->load->library('PhrasesLib');
$this->loadPhrases(
array(
'ui',
'lehre'
'ui'
)
);
@@ -92,11 +91,11 @@ class Gruppe extends FHCAPI_Controller
$lehreinheitgruppe_id = $this->input->post('lehreinheitgruppe_id');
if (is_null($lehreinheit_id) || !ctype_digit((string)$lehreinheit_id) || is_null($lehreinheitgruppe_id) || !ctype_digit((string)$lehreinheitgruppe_id))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$lehreinheitgruppe_result = $this->_ci->LehreinheitgruppeModel->loadWhere(array('lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (!hasData($lehreinheitgruppe_result) || isError($lehreinheitgruppe_result))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->terminateWithError( $this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$this->checkPermission($lehreinheit_id);
@@ -109,33 +108,15 @@ class Gruppe extends FHCAPI_Controller
}
public function getAllSearch()
public function getAll()
{
$query = $this->input->get('query');
if (is_null($query))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$query_words = explode(' ', $query);
$this->_ci->GruppeModel->addSelect('gruppe_kurzbz,
studiengang_kz,
semester,
bezeichnung,
gid,
\'false\' as lehrverband');
$this->_ci->GruppeModel->db->where(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null));
$this->_ci->GruppeModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->GruppeModel->db->group_start();
$this->_ci->GruppeModel->db->where('gruppe_kurzbz ILIKE', "%" . $word . "%");
$this->_ci->GruppeModel->db->or_where('bezeichnung ILIKE', "%" . $word . "%");
$this->_ci->GruppeModel->db->group_end();
}
$this->_ci->GruppeModel->db->group_end();
$gruppen_result = $this->_ci->GruppeModel->load();
$gruppen_result = $this->_ci->GruppeModel->loadWhere(array('sichtbar' => true, 'aktiv' => true, 'lehre' => true, 'direktinskription' => false, 'semester IS NOT NULL' => null));
$gruppen_array = array();
@@ -154,18 +135,7 @@ class Gruppe extends FHCAPI_Controller
$this->_ci->LehrverbandModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
$this->_ci->LehrverbandModel->addOrder('verband');
$this->_ci->LehrverbandModel->addOrder('gruppe');
$this->_ci->LehrverbandModel->db->where(array('tbl_lehrverband.aktiv' => true));
$this->_ci->LehrverbandModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->LehrverbandModel->db->group_start();
$this->_ci->LehrverbandModel->db->where('CONCAT(CONCAT(typ, kurzbz), \'\', semester, verband, COALESCE(gruppe,\'\')) ILIKE', "%" . $word . "%");
$this->_ci->LehrverbandModel->db->or_where('tbl_lehrverband.bezeichnung ILIKE', "%" . $word . "%");
$this->_ci->LehrverbandModel->db->group_end();
}
$this->_ci->LehrverbandModel->db->group_end();
$lehrverband_result = $this->_ci->LehrverbandModel->load();
$lehrverband_result = $this->_ci->LehrverbandModel->loadWhere(array('tbl_lehrverband.aktiv' => true));
$lehrverband_array = array();
@@ -180,40 +150,15 @@ class Gruppe extends FHCAPI_Controller
$this->terminateWithSuccess($all_gruppen);
}
public function getBenutzerSearch()
public function getBenutzer()
{
$query = $this->input->get('query');
if (is_null($query))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$query_words = explode(' ', $query);
$this->_ci->PersonModel->addSelect('vorname, nachname, uid, semester, UPPER(CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz)) as studiengang');
$this->_ci->PersonModel->addJoin('public.tbl_benutzer', 'person_id');
$this->_ci->PersonModel->addJoin('public.tbl_mitarbeiter', 'uid = mitarbeiter_uid', 'LEFT');
$this->_ci->PersonModel->addJoin('public.tbl_student', 'uid = student_uid', 'LEFT');
$this->_ci->PersonModel->addJoin('public.tbl_studiengang', 'studiengang_kz', 'LEFT');
$this->_ci->PersonModel->db->where(array('tbl_benutzer.aktiv' => true));
$this->_ci->PersonModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->PersonModel->db->group_start();
$this->_ci->PersonModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%");
$this->_ci->PersonModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%");
$this->_ci->PersonModel->db->or_where('uid ILIKE', "%" . $word . "%");
$this->_ci->PersonModel->db->or_where('CONCAT(tbl_studiengang.typ, tbl_studiengang.kurzbz) ILIKE', "%" . $word . "%");
if (is_numeric($word))
{
$this->_ci->PersonModel->db->or_where('semester', $word);
}
$this->_ci->PersonModel->db->group_end();
}
$this->_ci->PersonModel->db->group_end();
$personen = $this->_ci->PersonModel->load();
$personen = $this->_ci->PersonModel->loadWhere(array('tbl_benutzer.aktiv' => true));
$this->terminateWithSuccess(hasData($personen) ? getData($personen) : array());
}
@@ -169,10 +169,6 @@ class Lehreinheit extends FHCAPI_Controller
{
$value = $this->input->post($field);
if ($field === 'lehre')
{
$value = (bool)$value;
}
if ($value !== null)
{
$updateData[$field] = $value;
@@ -285,43 +281,15 @@ class Lehreinheit extends FHCAPI_Controller
public function delete()
{
$lehreinheit_id = $this->input->post('lehreinheit_id');
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit->lehreinheit_id);
$errors = array();
if (is_array($lehreinheit_id))
{
foreach ($lehreinheit_id as $le_id)
{
$lehreinheit = $this->checkLehreinheit($le_id);
$this->checkPermission($lehreinheit->lehreinheit_id);
$result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id);
$result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id);
if (isError($result))
$this->terminateWithValidationErrors(getError($result));
if (isError($result))
{
$errors[] = getError($result);
}
}
}
else
{
$lehreinheit = $this->checkLehreinheit($lehreinheit_id);
$this->checkPermission($lehreinheit->lehreinheit_id);
$result = $this->_ci->LehreinheitModel->deleteLehreinheit($lehreinheit->lehreinheit_id);
if (isError($result))
$this->terminateWithError(getError($result));
}
if (!isEmptyArray($errors))
{
if (count($errors) !== count($lehreinheit_id))
$this->terminateWithSuccess(array('errors' => $errors));
else
$this->terminateWithError($errors);
}
else
$this->terminateWithSuccess('Erfolgreich geloescht');
$this->terminateWithSuccess('Erfolgreich geloescht');
}
public function update()
@@ -15,7 +15,7 @@ class Lektor extends FHCAPI_Controller
'deleteLVPlan' => ['admin:rw', 'assistenz:rw'],
'deletePerson' => ['admin:rw', 'assistenz:rw'],
'getLehrfunktionen' => ['admin:r', 'assistenz:r'],
'getLektorenSearch' => ['admin:r', 'assistenz:r'],
'getLektoren' => ['admin:r', 'assistenz:r'],
'getLektorenByLE' => ['admin:r', 'assistenz:r'],
'getLektorDaten' => ['admin:r', 'assistenz:r'],
'getLektorVertrag' => ['admin:r', 'assistenz:r'],
@@ -208,35 +208,12 @@ class Lektor extends FHCAPI_Controller
$this->terminateWithSuccess(getData($this->_ci->LehrfunktionModel->load()));
}
public function getLektorenSearch()
public function getLektoren()
{
$query = $this->input->get('query');
if (is_null($query))
$this->terminateWithError($this->p->t('ui', 'ungueltigeParameter'), self::ERROR_TYPE_GENERAL);
$query_words = explode(' ', $query);
$this->_ci->MitarbeiterModel->addSelect('uid, person_id, vorname, nachname');
$this->_ci->MitarbeiterModel->addJoin('public.tbl_benutzer', 'uid = mitarbeiter_uid');
$this->_ci->MitarbeiterModel->addJoin('public.tbl_person', 'person_id');
$this->_ci->MitarbeiterModel->db->where('public.tbl_benutzer.aktiv', true);
$this->_ci->MitarbeiterModel->db->group_start();
foreach ($query_words as $word)
{
$this->_ci->MitarbeiterModel->db->group_start();
$this->_ci->MitarbeiterModel->db->where('tbl_person.vorname ILIKE', "%" . $word . "%");
$this->_ci->MitarbeiterModel->db->or_where('tbl_person.nachname ILIKE', "%" . $word . "%");
$this->_ci->MitarbeiterModel->db->or_where('uid ILIKE', "%" . $word . "%");
$this->_ci->MitarbeiterModel->db->group_end();
}
$this->_ci->MitarbeiterModel->db->group_end();
$this->_ci->MitarbeiterModel->addOrder('nachname');
$this->_ci->MitarbeiterModel->addOrder('vorname');
$result = $this->_ci->MitarbeiterModel->load();
$this->terminateWithSuccess(hasData($result) ? getData($result) : array());
$this->terminateWithSuccess(getData($this->_ci->MitarbeiterModel->loadWhere(array('public.tbl_benutzer.aktiv' => true))));
}
private function checkLehreinheit($lehreinheit_id)
@@ -5,7 +5,7 @@ if (!defined('BASEPATH'))
class Tags extends Tag_Controller
{
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:r'];
const BERECHTIGUNG_KURZBZ = ['admin:rw', 'assistenz:rw'];
public function __construct()
{
@@ -21,8 +21,6 @@ class Messages extends FHCAPI_Controller
'getReplyData' => ['admin:r', 'assistenz:r'],
'getPersonId' => ['admin:r', 'assistenz:r'],
'getUid' => ['admin:r', 'assistenz:r'],
'getStudiengang' => ['admin:r', 'assistenz:r'],
]);
//Load Models
@@ -86,17 +84,21 @@ class Messages extends FHCAPI_Controller
$this->terminateWithSuccess(array());
}
public function getDataVorlage($vorlage_kurzbz, $studiengang_kz)
public function getDataVorlage($vorlage_kurzbz)
{
if(!$studiengang_kz)
$this->terminateWithSuccess(null);
$studiengang_kz = 0;
$this->load->model('system/Vorlagestudiengang_model', 'VorlagestudiengangModel');
$this->VorlagestudiengangModel->addOrder('version', 'DESC');
$result = $this->VorlagestudiengangModel->getCurrent($vorlage_kurzbz, $studiengang_kz);
$result = $this->VorlagestudiengangModel->loadWhere(
[
'vorlage_kurzbz' =>$vorlage_kurzbz,
'studiengang_kz' => $studiengang_kz
]);
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess(current($data));
$vorlage = current($data);
$this->terminateWithSuccess($vorlage);
}
public function getMessageVarsPerson($id, $typeId)
@@ -141,6 +143,8 @@ class Messages extends FHCAPI_Controller
public function sendMessage($recipient_id)
{
//has to be uid
// $this->terminateWithError("uid", $recipient_id, self::ERROR_TYPE_GENERAL);
//default setting
$receiversPersonId = $this->_getPersonId($recipient_id, 'uid');
@@ -383,21 +387,6 @@ class Messages extends FHCAPI_Controller
$this->terminateWithSuccess($benutzer->uid);
}
public function getStudiengang($id, $typeId)
{
if($typeId!= "prestudent_id" && $typeId!="uid" )
$this->terminateWithSuccess(null);
$prestudent_id = ($typeId == 'uid') ? $this->_getPrestudentIdFromUid($id) : $id;
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$result = $this->PrestudentModel->load($prestudent_id);
$data = $this->getDataOrTerminateWithError($result);
$studiengang_kz = current($data)->studiengang_kz;
return $this->terminateWithSuccess($studiengang_kz);
}
private function _getPersonId($id, $typeId)
{
if ($typeId == 'uid' || $typeId == 'mitarbeiter_uid')
@@ -427,6 +416,7 @@ class Messages extends FHCAPI_Controller
private function _getPrestudentIdFromUid($uid)
{
// $this->terminateWithError($uid, self::ERROR_TYPE_GENERAL);
$this->load->model('crm/Student_model', 'StudentModel');
$result = $this->StudentModel->loadWhere(
['student_uid' => $uid]
@@ -298,7 +298,7 @@ class Aufnahmetermine extends FHCAPI_Controller
$reihungstestangetreten =
(isset($formData['reihungstestangetreten']) && !empty($formData['reihungstestangetreten']))
? $formData['reihungstestangetreten']
: false;
: null;
$aufnahmegruppe_kurzbz =
(isset($formData['aufnahmegruppe_kurzbz']) && !empty($formData['aufnahmegruppe_kurzbz']))
? $formData['aufnahmegruppe_kurzbz']
@@ -33,8 +33,6 @@ class Config extends FHCAPI_Controller
{
// TODO(chris): permissions
parent::__construct([
'get' => ['admin:r', 'assistenz:r'],
'set' => ['admin:r', 'assistenz:r'],
'filter' => ['admin:r', 'assistenz:r'],
'student' => ['admin:r', 'assistenz:r'],
'students' => ['admin:r', 'assistenz:r']
@@ -57,95 +55,6 @@ class Config extends FHCAPI_Controller
}
/**
* get App config
*/
public function get()
{
$this->load->model('system/Variable_model', 'VariableModel');
$this->load->config('stv');
$config = [];
#number_displayed_past_studiensemester
$result = $this->VariableModel->getVariables(getAuthUID(), ['number_displayed_past_studiensemester']);
$data = $this->getDataOrTerminateWithError($result);
$number_displayed_past_studiensemester_default = $this->config->item('number_displayed_past_studiensemester_default');
$config['number_displayed_past_studiensemester'] = [
"type" => "number",
"label" => $this->p->t('stv', 'settings_no_displayed_past_sem'),
"value" => $data['number_displayed_past_studiensemester']
?? $number_displayed_past_studiensemester_default
];
#font_size
$result = $this->VariableModel->getVariables(getAuthUID(), ['stv_font_size']);
$data = $this->getDataOrTerminateWithError($result);
$config['font_size'] = [
"type" => "select",
"label" => $this->p->t('stv', 'settings_fontsize'),
"value" => $data['stv_font_size'] ?? "fs_normal",
"options" => [
"fs_xx-small" => $this->p->t('stv', 'settings_fontsize_xx-small'),
"fs_x-small" => $this->p->t('stv', 'settings_fontsize_x-small'),
"fs_small" => $this->p->t('stv', 'settings_fontsize_small'),
"fs_normal" => $this->p->t('stv', 'settings_fontsize_normal'),
"fs_big" => $this->p->t('stv', 'settings_fontsize_big'),
"fs_huge" => $this->p->t('stv', 'settings_fontsize_huge')
]
];
#others
Events::trigger('stv_config_get', function & () use (&$config) {
return $config;
});
$this->terminateWithSuccess($config);
}
/**
* set App config
*/
public function set()
{
$this->load->model('system/Variable_model', 'VariableModel');
$this->load->library('form_validation');
$this->form_validation->set_rules(
'number_displayed_past_studiensemester',
$this->p->t('stv', 'settings_no_displayed_past_sem'),
'required|integer'
);
$this->form_validation->set_rules(
'font_size',
$this->p->t('stv', 'settings_fontsize'),
'required|in_list[fs_xx-small,fs_x-small,fs_small,fs_normal,fs_big,fs_huge]'
);
Events::trigger('stv_config_validation', $this->form_validation);
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$this->VariableModel->setVariable(
getAuthUID(),
'number_displayed_past_studiensemester',
$this->input->post('number_displayed_past_studiensemester')
);
$this->VariableModel->setVariable(
getAuthUID(),
'stv_font_size',
$this->input->post('font_size')
);
Events::trigger('stv_config_set', $this->input);
$this->terminateWithSuccess();
}
/*
* Get the config for the student filters
*
* @return void
@@ -498,15 +407,6 @@ class Config extends FHCAPI_Controller
]
];
if($this->permissionlib->isBerechtigt('basis/person'))
{
$result['combinePeople'] = [
'title' => $this->p->t('stv', 'tab_combine_people'),
'component' => './Stv/Studentenverwaltung/Details/CombinePeople.js',
'config' => $config['combinePeople']
];
}
$result['kontaktieren'] = [
'title' => $this->p->t('stv', 'tab_kontaktieren'),
'component' => absoluteJsImportUrl('public/js/components/Stv/Studentenverwaltung/Details/Kontaktieren.js'),
@@ -83,7 +83,7 @@ class GemeinsameStudien extends FHCAPI_Controller
{
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
$this->StudiensemesterModel->addOrder('start', 'DESC');
$this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC');
$result = $this->StudiensemesterModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
@@ -147,8 +147,7 @@ class Gruppen extends FHCAPI_Controller
'lehre' => true,
'sichtbar' => true,
'aktiv' => true,
'direktinskription' => false,
'generiert' => false
'direktinskription' => false
]);
$data = $this->getDataOrTerminateWithError($result);
@@ -268,6 +268,10 @@ class Projektarbeit extends FHCAPI_Controller
{
$this->form_validation->set_data($formData);
$this->form_validation->set_rules('titel', 'Titel', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Titel'])
]);
$this->form_validation->set_rules('projekttyp_kurzbz', 'Projekttyp', 'required', [
'required' => $this->p->t('ui', 'error_fieldRequired', ['field' => 'Projekttyp'])
]);
@@ -18,8 +18,6 @@
if (! defined('BASEPATH')) exit('No direct script access allowed');
use \DateTime as DateTime;
/**
* This controller operates between (interface) the JS (GUI) and the back-end
* Provides data to the ajax get calls about addresses
@@ -113,7 +111,7 @@ class Pruefung extends FHCAPI_Controller
// Load language phrases
$this->loadPhrases([
'global', 'ui', 'lehre', 'exam'
'global', 'ui','lehre'
]);
}
@@ -174,11 +172,174 @@ class Pruefung extends FHCAPI_Controller
*
* @param lehrveranstaltung_id, student_uid, lehreinheit_id
*
* @return void
* @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()
{
$this->insertOrUpdatePruefung();
$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);
}
/**
@@ -187,6 +348,8 @@ class Pruefung extends FHCAPI_Controller
* @param pruefung_id
*
* @return success or error
*
* no impact on lehre.tbl_zeugnisnote
*/
public function updatePruefung($pruefung_id)
{
@@ -196,7 +359,48 @@ class Pruefung extends FHCAPI_Controller
if (!$oldpruefung)
show_404(); // Pruefung that should be updated does not exist
$this->insertOrUpdatePruefung($pruefung_id);
$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);
}
/**
@@ -370,198 +574,4 @@ class Pruefung extends FHCAPI_Controller
return $this->terminateWithSuccess($data);
}
protected function insertOrUpdatePruefung($pruefung_id=null)
{
$authUID = getAuthUID();
$this->load->library('form_validation');
$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());
}
$this->load->model('education/Zeugnisnote_model', 'ZeugnisnoteModel');
$this->PruefungModel->db->trans_start();
if ($this->input->post('pruefungstyp_kurzbz') == "Termin2")
{
//Wenn ein 2. Termin angelegt wird, und kein 1. Termin vorhanden ist,
//dann wird auch ein 1. Termin angelegt mit der derzeitigen Zeugnisnote
$resultP = $this->PruefungModel->loadWhere(array(
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
'student_uid' => $this->input->post('student_uid'),
'pruefungstyp_kurzbz' => 'Termin1'));
$termin1 = $this->getDataOrTerminateWithError($resultP);
if (!$termin1)
{
//check if existing Zeugnisnote
$this->ZeugnisnoteModel->addJoin('lehre.tbl_lehreinheit', 'lehrveranstaltung_id');
$this->ZeugnisnoteModel->db->where(
'lehre.tbl_zeugnisnote.studiensemester_kurzbz',
'lehre.tbl_lehreinheit.studiensemester_kurzbz',
false
);
$resultP = $this->ZeugnisnoteModel->loadWhere(array(
'lehrveranstaltung_id' => $this->input->post('lehrveranstaltung_id'),
'student_uid' => $this->input->post('student_uid')
));
$zeugnisnoten = $this->getDataOrTerminateWithError($resultP);
if ($zeugnisnoten)
{
$zeugnisnote = current($zeugnisnoten);
$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' => $zeugnisnote->benotungsdatum,
'pruefungstyp_kurzbz' => 'Termin1',
'note' => $zeugnisnote->note,
'punkte' => $zeugnisnote->punkte,
'anmerkung' => 'automatisiert aus Zeugnisnote erstellt',
'insertamum' => date('c'),
'insertvon' => $authUID,
]);
$this->getDataOrTerminateWithError($resultN);
}
//Wenn keine Zeugnisnote vorhanden ist, dann wird kein
//1.Termin angelegt
}
}
if(intval($pruefung_id) > 0)
{
$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'),
]
);
}
else
{
$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,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
]);
}
$this->getDataOrTerminateWithError($result);
//get studiensemester_kurzbz and lehreveranstaltung_id from lehreinheit
$this->load->model('education/Lehreinheit_model', 'LehreinheitModel');
$result = $this->LehreinheitModel->load($this->input->post('lehreinheit_id'));
$lehreinheiten = $this->getDataOrTerminateWithError($result);
if (!$lehreinheiten) {
$this->terminateWithValidationErrors([
'lehreinheit_id' => $this->p->t('ui', 'error_fieldNotFound', [
'field' => $this->p->t('lehre', 'lehreinheit')
])
]);
}
$lehreinheit = current($lehreinheiten);
$studiensemester_kurzbz = $lehreinheit->studiensemester_kurzbz;
$lehrveranstaltung_id = $lehreinheit->lehrveranstaltung_id;
//check if existing zeugnisnote
$result = $this->ZeugnisnoteModel->loadWhere(array(
'lehrveranstaltung_id' => $lehrveranstaltung_id,
'student_uid' => $this->input->post('student_uid'),
'studiensemester_kurzbz' => $studiensemester_kurzbz
));
$zeugnisnoten = $this->getDataOrTerminateWithError($result);
if (!$zeugnisnoten)
{
//insert zeugnisnote, if not existing
$result = $this->ZeugnisnoteModel->insert(array(
'lehrveranstaltung_id' => $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,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
));
$this->getDataOrTerminateWithError($result);
$this->PruefungModel->db->trans_complete();
$this->terminateWithSuccess();
}
$note = current($zeugnisnoten);
$uebernahmedatum = new DateTime($note->uebernahmedatum);
$benotungsdatum = new DateTime($note->benotungsdatum);
$pruefungsdatum = new DateTime($this->input->post('datum'));
$checkDate = $note->uebernahmedatum === '' || $benotungsdatum > $uebernahmedatum
? $benotungsdatum
: $uebernahmedatum;
if ($checkDate > $pruefungsdatum && $this->input->post('note') !== $note->note)
{
$this->PruefungModel->db->trans_complete();
$this->terminateWithSuccess($this->p->t('exam', 'hinweis_changeAfterExamDate'));
}
//update zeugnisnote, if existing and valid datum
$result = $this->ZeugnisnoteModel->update([
'lehrveranstaltung_id' => $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'),
'updateamum' => date('c'),
'updatevon' => $authUID,
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
]);
$this->PruefungModel->db->trans_complete();
$this->terminateWithSuccess();
}
}
@@ -112,28 +112,16 @@ class Student extends FHCAPI_Controller
if (defined('ACTIVE_ADDONS') && strpos(ACTIVE_ADDONS, 'bewerbung') !== false) {
$this->PrestudentModel->addSelect(
"(
SELECT kontakt
FROM public.tbl_kontakt
WHERE kontakttyp='email'
AND person_id=p.person_id
AND zustellung
ORDER BY kontakt_id DESC
SELECT kontakt
FROM public.tbl_kontakt
WHERE kontakttyp='email'
AND person_id=p.person_id
AND zustellung
ORDER BY kontakt_id
LIMIT 1
) AS email_privat",
false
);
$this->PrestudentModel->addSelect(
"(
SELECT kontakt
FROM public.tbl_kontakt
WHERE kontakttyp='email_unverifiziert'
AND person_id=p.person_id
AND zustellung
ORDER BY kontakt_id DESC
LIMIT 1
) AS email_privat_unverified",
false
);
}
$this->PrestudentModel->addSelect(
"(
@@ -765,86 +765,6 @@ class Students extends FHCAPI_Controller
$this->terminateWithSuccess($data);
}
/**
* @param string $studiensemester_kurzbz
*
* @return void
*/
public function search($studiensemester_kurzbz)
{
$this->addMeta('ci_method', __FUNCTION__);
$this->addMeta('ci_params', array(
'studiensemester_kurzbz' => $studiensemester_kurzbz
));
$this->load->library('SearchLib', [ 'config' => 'searchstv' ]);
$this->load->library('form_validation');
$this->form_validation->set_rules('searchstr', 'searchstr', 'required');
$this->form_validation->set_rules('types[]', 'types', 'required');
if (!$this->form_validation->run())
$this->terminateWithValidationErrors($this->form_validation->error_array());
$result = $this->searchlib->search($this->input->post('searchstr'), $this->input->post('types'));
$data = $this->getDataOrTerminateWithError($result);
$this->load->model('crm/Prestudent_model', 'PrestudentModel');
$this->prepareQuery($studiensemester_kurzbz);
$this->PrestudentModel->addSelect("COALESCE(v.semester::text, CASE WHEN public.get_rolle_prestudent(tbl_prestudent.prestudent_id, NULL) IN ('Aufgenommener', 'Bewerber', 'Wartender', 'interessent') THEN public.get_absem_prestudent(tbl_prestudent.prestudent_id, NULL)::text ELSE ''::text END) AS semester", false);
$this->PrestudentModel->addSelect('v.verband');
$this->PrestudentModel->addSelect('v.gruppe');
//add status per semester
$this->PrestudentModel->addSelect(
"(
SELECT status_kurzbz
FROM public.tbl_prestudentstatus pss
WHERE pss.prestudent_id = public.tbl_prestudent.prestudent_id
AND pss.studiensemester_kurzbz = " . $this->PrestudentModel->escape($studiensemester_kurzbz) . "
ORDER BY GREATEST(pss.datum, '0001-01-01') DESC
LIMIT 1
) AS statusofsemester"
);
$this->addSelectPrioRel();
$this->addFilter($studiensemester_kurzbz);
$prestudent_ids = [];
$student_uids = [];
$this->addMeta('data', $data);
foreach ($data as $row) {
$dataset = json_decode($row->data);
if ($row->type == 'prestudent') {
$prestudent_ids[] = $dataset->prestudent_id;
} elseif ($row->type == 'student') {
$student_uids[] = $dataset->uid;
}
}
if ($prestudent_ids && $student_uids) {
$this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids);
$this->PrestudentModel->db->or_where_in('s.student_uid', $student_uids);
} elseif ($prestudent_ids) {
$this->PrestudentModel->db->where_in('tbl_prestudent.prestudent_id', $prestudent_ids);
} elseif ($student_uids) {
$this->PrestudentModel->db->where_in('s.student_uid', $student_uids);
} else {
$this->terminateWithSuccess([]);
}
$result = $this->PrestudentModel->load();
$data = $this->getDataOrTerminateWithError($result);
$this->terminateWithSuccess($data);
}
/**
* @param string|null $studiensemester_kurzbz
* @param string $type
@@ -165,17 +165,7 @@ class Verband extends FHCAPI_Controller
$this->StudiengangModel->addDistinct();
$this->StudiengangModel->addSelect("CONCAT(" . $this->StudiengangModel->escape($link) . ", semester) AS link", false);
$this->StudiengangModel->addSelect("CONCAT(
UPPER(CONCAT(typ, kurzbz)),
'-',
semester,
(
SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END
FROM public.tbl_lehrverband
WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester
ORDER BY verband, gruppe LIMIT 1
)
) AS name", false);
$this->StudiengangModel->addSelect("CONCAT(UPPER(CONCAT(typ, kurzbz)), '-', semester, (SELECT CASE WHEN bezeichnung IS NULL OR bezeichnung='' THEN ''::TEXT ELSE CONCAT(' (', bezeichnung, ')') END FROM public.tbl_lehrverband WHERE studiengang_kz=v.studiengang_kz AND semester=v.semester ORDER BY verband, gruppe LIMIT 1)) AS name", false);
$this->StudiengangModel->addSelect('semester');
$this->StudiengangModel->addSelect($this->StudiengangModel->escape($studiengang_kz) . '::integer AS stg_kz', false);
@@ -183,7 +173,6 @@ class Verband extends FHCAPI_Controller
$this->StudiengangModel->addOrder('semester');
if ($org_form !== null) {
$this->StudiengangModel->addSelect("v.orgform_kurzbz");
$this->StudiengangModel->db->group_start();
$this->StudiengangModel->db->where('v.semester', 0);
$this->StudiengangModel->db->or_where('v.orgform_kurzbz', $org_form);
@@ -199,7 +188,6 @@ class Verband extends FHCAPI_Controller
array_unshift($list, [
'name' => 'PreStudent',
'link' => $link . 'prestudent',
'no_sem_reload' => true,
'stg_kz' => (int)$studiengang_kz,
'children' => $this->getStdSem($link . 'prestudent/', $studiengang_kz)
]);
@@ -228,6 +216,7 @@ class Verband extends FHCAPI_Controller
$list = array_merge($list, $result);
}
}
}
$this->terminateWithSuccess($list);
}
@@ -233,10 +233,10 @@ class Person extends API_Controller
//Quersumme bilden
for ($i = 0; $i < 10; $i++)
{
$erg += $gewichtung[$i] * $tmpSvnr[$i];
$erg += $gewichtung[$i] * $tmpSvnr{$i};
}
if ($tmpSvnr[3] != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11
if ($tmpSvnr{3} != ($erg % 11)) //Vergleichen der Pruefziffer mit Quersumme Modulo 11
{
return error('SVNR ist ungueltig');
}
@@ -244,7 +244,7 @@ class Person extends API_Controller
if (mb_strlen($person['svnr']) == 12)
{
$last = substr($person['svnr'], 10, 12);
if ($last[0] != 'v' || !is_numeric($last[1]))
if ($last{0} != 'v' || !is_numeric($last{1}))
{
return error('SVNR ist ungueltig');
}
@@ -22,7 +22,6 @@ class InfoCenter extends Auth_Controller
const REIHUNGSTESTABSOLVIERT_PAGE = 'reihungstestAbsolviert';
const ABGEWIESEN_PAGE = 'abgewiesen';
const AUFGENOMMEN_PAGE = 'aufgenommen';
const ONBOARDING_PAGE = 'onboarding';
const SHOW_DETAILS_PAGE = 'showDetails';
const SHOW_ZGV_DETAILS_PAGE = 'showZGVDetails';
const ZGV_UBERPRUEFUNG_PAGE = 'ZGVUeberpruefung';
@@ -117,7 +116,6 @@ class InfoCenter extends Auth_Controller
'index' => 'infocenter:r',
'freigegeben' => 'infocenter:r',
'abgewiesen' => 'infocenter:r',
'onboarding' => 'infocenter:r',
'aufgenommen' => 'infocenter:r',
'reihungstestAbsolviert' => 'infocenter:r',
'showDetails' => 'infocenter:r',
@@ -232,13 +230,6 @@ class InfoCenter extends Auth_Controller
$this->load->view('system/infocenter/infocenterAbgewiesen.php');
}
public function onboarding()
{
$this->_setNavigationMenu(self::ONBOARDING_PAGE); // define the navigation menu for this page
$this->load->view('system/infocenter/onboarding.php');
}
/**
* Aufgenommene page of the InfoCenter tool
@@ -1562,7 +1553,6 @@ class InfoCenter extends Auth_Controller
$reihungstestAbsolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE);
$abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
$aufgenommenLink = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE);
$onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE);
$currentFilterId = $this->input->get(self::FILTER_ID);
if (isset($currentFilterId))
@@ -1571,7 +1561,6 @@ class InfoCenter extends Auth_Controller
$reihungstestAbsolviertLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$abgewiesenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$aufgenommenLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
$onboardingLink .= '?'.self::PREV_FILTER_ID.'='.$currentFilterId;
}
$this->navigationlib->setSessionMenu(
@@ -1635,18 +1624,6 @@ class InfoCenter extends Auth_Controller
'', // target
40 // sort
),
'ohnePrestudent' => $this->navigationlib->oneLevel(
'Electronic Onboarding', // description
$onboardingLink, // link
null, // children
'users', // icon
null, // subscriptDescription
false, // expand
null, // subscriptLinkClass
null, // subscriptLinkValue
'', // target
50 // sort
),
)
);
}
@@ -1673,8 +1650,6 @@ class InfoCenter extends Auth_Controller
$link = site_url(self::ZGV_UEBERPRUEFUNG_URI);
if ($origin_page === self::ABGEWIESEN_PAGE)
$link = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
if ($origin_page === self::ONBOARDING_PAGE)
$link = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE);
if ($origin_page === self::AUFGENOMMEN_PAGE)
$link = site_url(self::INFOCENTER_URI.'/'.self::AUFGENOMMEN_PAGE);
@@ -1716,7 +1691,6 @@ class InfoCenter extends Auth_Controller
$freigegebenLink = site_url(self::INFOCENTER_URI.'/'.self::FREIGEGEBEN_PAGE);
$absolviertLink = site_url(self::INFOCENTER_URI.'/'.self::REIHUNGSTESTABSOLVIERT_PAGE);
$abgewiesenLink = site_url(self::INFOCENTER_URI.'/'.self::ABGEWIESEN_PAGE);
$onboardingLink = site_url(self::INFOCENTER_URI.'/'.self::ONBOARDING_PAGE);
$prevFilterId = $this->input->get(self::PREV_FILTER_ID);
if (isset($prevFilterId))
{
@@ -1793,24 +1767,6 @@ class InfoCenter extends Auth_Controller
)
);
}
if($page == self::ONBOARDING_PAGE)
{
$this->navigationlib->setSessionElementMenu(
'onboarding',
$this->navigationlib->oneLevel(
'Electronic Onboarding', // description
$onboardingLink, // link
null, // children
'users', // icon
null, // subscriptDescription
false, // expand
null, // subscriptLinkClass
null, // subscriptLinkValue
'', // target
50 // sort
)
);
}
}
/**
+2 -10
View File
@@ -17,7 +17,6 @@ class LektorLib
$this->_ci->load->model('organisation/Organisationseinheit_model', 'OrganisationseinheitModel');
$this->_ci->load->model('ressource/mitarbeiter_model', 'MitarbeiterModel');
$this->_ci->load->model('person/Benutzer_model', 'BenutzerModel');
$this->_ci->load->library('PhrasesLib', array('lehre'));
}
public function addLektorToLehreinheit($lehreinheit_id, $mitarbeiter_uid)
@@ -36,7 +35,7 @@ class LektorLib
if (isError($already_assigned)) return $already_assigned;
if (hasData($already_assigned)) return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt"));
if (hasData($already_assigned)) return error('Lektor already assigned');
$studiensemester_result = $this->_ci->StudiensemesterModel->loadWhere(array('studiensemester_kurzbz' => $lehreinheit->studiensemester_kurzbz));
if (isError($studiensemester_result)) return $studiensemester_result;
@@ -89,7 +88,6 @@ class LektorLib
$lehreinheit = getData($lehreinheit_result)[0];
//TODO kollision check, wird vorerst nicht implementiert -> nur über das FAS möglich
if (isset($new_data['mitarbeiter_uid']) && $new_data['mitarbeiter_uid'] !== $mitarbeiter_uid)
{
@@ -100,13 +98,7 @@ class LektorLib
$verplant = $this->_ci->StundenplandevModel->loadWhere(array('lehreinheit_id' => $lehreinheit_id, 'mitarbeiter_uid' => $mitarbeiter_uid));
if (hasData($verplant))
return error($this->_ci->phraseslib->t("lehre", "lektorbereitsverplant"));
$lehreinheit_data = $this->_ci->LehreinheitmitarbeiterModel->loadWhere(array('mitarbeiter_uid' => $new_data['mitarbeiter_uid'], 'lehreinheit_id' => $lehreinheit_id));
if (hasData($lehreinheit_data))
return error($this->_ci->phraseslib->t("lehre", "bereitzugeteilt"));
return error('Wechsel vom Mitarbeiter nicht möglich da er bereits verplant ist!');
}
$warning = '';
if (isset($new_data['semesterstunden']))
@@ -651,13 +651,7 @@ EOSQL;
ELSE NULL
END
END,
' '
ORDER BY
UPPER(tbl_studiengang.typ::varchar(1) || tbl_studiengang.kurzbz),
COALESCE(TRIM(tbl_lehreinheitgruppe.semester::text), ''),
COALESCE(TRIM(tbl_lehreinheitgruppe.verband), ''),
COALESCE(TRIM(tbl_lehreinheitgruppe.gruppe), ''),
COALESCE(tbl_lehreinheitgruppe.gruppe_kurzbz, '')
' '
) AS gruppen
FROM lehre.tbl_lehreinheitgruppe
LEFT JOIN public.tbl_studiengang USING (studiengang_kz)
@@ -374,7 +374,7 @@ class Lehreinheitgruppe_model extends DB_Model
return success('Group assigned successfully to Lehreinheit');
}
else
return error($this->p->t('lehre', 'grpbereitszugeteilt'));
return error('Group already assigned');
}
public function deleteGroup($lehreinheit_id, $lehreinheitgruppe_id)
@@ -401,7 +401,7 @@ class Lehreinheitgruppe_model extends DB_Model
$stundenplan_result = $this->loadWhere(array('tbl_lehreinheitgruppe.lehreinheitgruppe_id' => $lehreinheitgruppe_id));
if (hasData($stundenplan_result))
return error($this->p->t('lehre', 'grpbereitsverplant'));
return error('Gruppe already verplant');
$delete_result = $this->delete($lehreinheitgruppe_id);
@@ -254,16 +254,22 @@ EOSQL;
return $dvs;
}
public function existsDienstverhaeltnis($mitarbeiter_uid, $start, $ende, $vertragsart_kurzbz)
public function existsDienstverhaeltnis($mitarbeiter_uid, $start, $ende = null, $vertragsart_kurzbz = null)
{
$this->addOrder('von', 'DESC');
$this->db->where('mitarbeiter_uid', $mitarbeiter_uid);
$this->db->where('vertragsart_kurzbz', $vertragsart_kurzbz);
if (!is_null($vertragsart_kurzbz))
$this->db->where('vertragsart_kurzbz', $this->escape($vertragsart_kurzbz));
$this->db->where('von <=', $ende);
$this->db->group_start();
$this->db->where('bis >=', $start);
$this->db->or_where('bis IS NULL', null, false);
$this->db->group_end();
if (!is_null($ende))
{
$this->db->group_start();
$this->db->where('bis >=', $start);
$this->db->or_where('bis IS NULL', null, false);
$this->db->group_end();
}
$this->addLimit(1);
return $this->load();
+1 -4
View File
@@ -22,8 +22,7 @@
'public/css/components/function.css'
],
'customJSs' => [
'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js',
'vendor/moment/luxonjs/luxon.min.js'
'vendor/vuejs/vuedatepicker_js/vue-datepicker.iife.js'
#'vendor/npm-asset/primevue/tree/tree.min.js',
#'vendor/npm-asset/primevue/toast/toast.min.js'
],
@@ -54,8 +53,6 @@ $configArray = [
active-addons="<?= defined('ACTIVE_ADDONS') ? ACTIVE_ADDONS : ''; ?>"
stv-root="<?= site_url('Studentenverwaltung'); ?>"
cis-root="<?= CIS_ROOT; ?>"
avatar-url="<?= site_url('Cis/Pub/bild/person/' . getAuthPersonId()); ?>"
logout-url="<?= site_url('Cis/Auth/logout'); ?>"
:permissions="<?= htmlspecialchars(json_encode($permissions)); ?>"
:config="<?= htmlspecialchars(json_encode($configArray)); ?>"
>
@@ -1,47 +0,0 @@
<?php
$this->load->view(
'templates/FHC-Header',
array(
'title' => 'Info Center',
'jquery3' => true,
'jqueryui1' => true,
'jquerycheckboxes1' => true,
'bootstrap3' => true,
'fontawesome4' => true,
'sbadmintemplate3' => true,
'tablesorter2' => true,
'ajaxlib' => true,
'filterwidget' => true,
'navigationwidget' => true,
'dialoglib' => true,
'phrases' => array(
'person' => array('vorname', 'nachname'),
'ui' => array('bitteEintragWaehlen')
),
'customCSSs' => array('public/css/sbadmin2/tablesort_bootstrap.css', 'public/css/infocenter/infocenterPersonDataset.css'),
'customJSs' => array('public/js/bootstrapper.js', 'public/js/infocenter/rueckstellung.js', 'public/js/infocenter/infocenterPersonDataset.js')
)
);
?>
<div id="wrapper">
<?php echo $this->widgetlib->widget('NavigationWidget'); ?>
<div id="page-wrapper">
<div class="container-fluid">
<div class="row">
<div class="col-lg-12">
<h3 class="page-header">
Electronic Onboarding
</h3>
</div>
</div>
<div>
<?php $this->load->view('system/infocenter/onboardingData.php'); ?>
</div>
</div>
</div>
</div>
<?php $this->load->view('templates/FHC-Footer'); ?>
@@ -1,116 +0,0 @@
<?php
$APP = '\'infocenter\'';
$KENNZEICHEN = '\'eobRegistrierungsId\'';
$query = '
SELECT
p.person_id AS "PersonId",
p.vorname AS "Vorname",
p.nachname AS "Nachname",
pl.zeitpunkt AS "LockDate",
pl.lockuser AS "LockUser",
rueck.datum_bis AS "HoldDate",
rueck.bezeichnung AS "Rueckstellgrund"
FROM public.tbl_person p
JOIN tbl_kennzeichen ON p.person_id = tbl_kennzeichen.person_id AND kennzeichentyp_kurzbz = '. $KENNZEICHEN .'
LEFT JOIN (
SELECT tpl.person_id,
tpl.zeitpunkt,
sp.nachname AS lockuser
FROM system.tbl_person_lock tpl
JOIN public.tbl_benutzer sb USING (uid)
JOIN public.tbl_person sp ON sb.person_id = sp.person_id
WHERE tpl.app = '.$APP.'
) pl ON p.person_id = pl.person_id
LEFT JOIN (
SELECT
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
)
) rueck ON rueck.person_id = p.person_id
WHERE p.person_id NOT IN (SELECT person_id FROM public.tbl_prestudent)';
$filterWidgetArray = array(
'query' => $query,
'app' => InfoCenter::APP,
'datasetName' => 'onboarding',
'filter_id' => $this->input->get('filter_id'),
'requiredPermissions' => 'infocenter',
'datasetRepresentation' => 'tablesorter',
'checkboxes' => 'PersonId',
'additionalColumns' => array('Details'),
'columnsAliases' => array(
'PersonId',
ucfirst($this->p->t('person', 'vorname')) ,
ucfirst($this->p->t('person', 'nachname')),
ucfirst($this->p->t('global', 'sperrdatum')),
ucfirst($this->p->t('global', 'gesperrtVon')),
ucfirst($this->p->t('infocenter', 'rueckstelldatum')),
ucfirst($this->p->t('infocenter', 'rueckstellgrund')),
),
'formatRow' => function($datasetRaw) {
/* NOTE: Dont use $this here for PHP Version compatibility */
$datasetRaw->{'Details'} = sprintf(
'<a href="%s?person_id=%s&origin_page=%s&fhc_controller_id=%s&prev_filter_id=%s">Details</a>',
site_url('system/infocenter/InfoCenter/showDetails'),
$datasetRaw->{'PersonId'},
'onboarding',
(isset($_GET['fhc_controller_id']) ? $_GET['fhc_controller_id'] : ''),
(isset($_GET['filter_id']) ? $_GET['filter_id'] : '')
);
if ($datasetRaw->{'LockDate'} == null)
{
$datasetRaw->{'LockDate'} = '-';
}
if ($datasetRaw->{'LockUser'} == null)
{
$datasetRaw->{'LockUser'} = '-';
}
if ($datasetRaw->{'HoldDate'} == null)
{
$datasetRaw->{'HoldDate'} = '-';
}
else
{
$datasetRaw->{'HoldDate'} = date_format(date_create($datasetRaw->{'HoldDate'}), 'Y-m-d H:i');
}
if ($datasetRaw->{'Rueckstellgrund'} === null)
{
$datasetRaw->{'Rueckstellgrund'} = '-';
}
return $datasetRaw;
},
'markRow' => function($datasetRaw) {
if ($datasetRaw->LockDate != null)
{
return FilterWidget::DEFAULT_MARK_ROW_CLASS;
}
}
);
echo $this->widgetlib->widget('FilterWidget', $filterWidgetArray);
?>
@@ -106,7 +106,6 @@
<tbody>
<?php
$lastMailAdress = '';
$lastUnverifiedMailAdress = '';
foreach ($stammdaten->kontakte as $kontakt): ?>
<tr>
<?php if ($kontakt->kontakttyp === 'email'): ?>
@@ -120,16 +119,14 @@
<?php echo '<span class="kontakt '.$kontakt->kontakttyp.'" data-id="'. $kontakt->kontakt_id .'" data-value="' . $kontakt->kontakt .'">';?>
<?php if ($kontakt->kontakttyp === 'email'): ?>
<a href="mailto:<?php echo $kontakt->kontakt; ?>" target="_top">
<?php $lastMailAdress = $kontakt->kontakt; ?>
<?php elseif ($kontakt->kontakttyp === 'email_unverifiziert'): ?>
<?php $lastUnverifiedMailAdress = $kontakt->kontakt;
<?php $lastMailAdress = $kontakt->kontakt;
endif;
echo $kontakt->kontakt;
if ($kontakt->kontakttyp === 'email'):
if ($kontakt->kontakttyp === 'email'):
?>
</a>
<?php endif; ?>
<?php echo '</span>'?>
<?php endif; ?>
<?php echo '</span>'?>
</td>
<td><?php echo $kontakt->anmerkung; ?></td>
</tr>
@@ -143,9 +140,9 @@
<?php if (isset($adresse)): ?>
<div class="row adresse col-sm-12" data-id="<?php echo $adresse->adresse_id ?>">
<div class="float-left" data-value="<?php echo $adresse->strasse ?>" data-type="strasse"><?php echo $adresse->strasse ?></div>
<div class="float-left" data-value="<?php echo $adresse->plz ?>" data-type="plz"><?php echo $adresse->plz ?></div>
<div class="float-left" data-value="<?php echo $adresse->ort ?>" data-type="ort"><?php echo $adresse->ort ?></div>
<?php if (isset($adresse->nationkurztext)): ?>
@@ -185,8 +182,7 @@
</div>
<?php if (isset($stammdaten->zugangscode)): ?>
<div class="col-xs-6 text-right">
<a href="<?php echo CIS_ROOT.'addons/bewerbung/cis/registration.php?code='.html_escape($stammdaten->zugangscode)
.'&emailAdresse='.(isEmptyString($lastMailAdress)?$lastUnverifiedMailAdress:$lastMailAdress).'&keepEmailUnverified=true' ?>"
<a href="<?php echo CIS_ROOT.'addons/bewerbung/cis/registration.php?code='.html_escape($stammdaten->zugangscode).'&emailAdresse='.$lastMailAdress.'&keepEmailUnverified=true' ?>"
target='_blank'><i class="glyphicon glyphicon-new-window"></i>&nbsp;<?php echo $this->p->t('infocenter','zugangBewerbung') ?></a>
</div>
<?php endif; ?>
-5
View File
@@ -62,11 +62,6 @@ if(!$rechte->isBerechtigt('student/noten',$studiengang_kz, 's'))
$semester = isset($_GET['semester'])?$_GET['semester']:'';
$typ = isset($_GET['typ'])?$_GET['typ']:'';
if(isset($_GET['studiensemester']) && preg_match('/[WS]S[0-9]{4}/', $_GET['studiensemester']))
{
$semester_aktuell = $_GET['studiensemester'];
}
if($semester=='')
die('Bitte ein Semester auswaehlen');
@@ -64,11 +64,6 @@ if (!$rechte->isBerechtigt('student/noten', $studiengang_kz, 's'))
$semester = isset($_GET['semester']) ? $_GET['semester'] : '';
$typ = isset($_GET['typ']) ? $_GET['typ'] : '';
if(isset($_GET['studiensemester']) && preg_match('/[WS]S[0-9]{4}/', $_GET['studiensemester']))
{
$semester_aktuell = $_GET['studiensemester'];
}
if ($semester == '')
die('Bitte ein Semester auswaehlen');
+6 -6
View File
@@ -178,7 +178,7 @@ class File_CSV
return $field;
}
if ($quote && $field[0] == $quote && $field[strlen($field) - 1] == $quote) {
if ($quote && $field{0} == $quote && $field{strlen($field)-1} == $quote) {
return substr($field, 1, -1);
}
return $field;
@@ -230,7 +230,7 @@ class File_CSV
} elseif ($c == "\n" || $c == "\r") {
$sub = ($prev == "\r") ? 2 : 1;
if ((strlen($buff) >= $sub) &&
($buff[strlen($buff) - $sub] == $quote))
($buff{strlen($buff) - $sub} == $quote))
{
$in_quote = false;
}
@@ -312,9 +312,9 @@ class File_CSV
$last =& $fields[count($fields) - 1];
// Fallback to read the line with readQuoted when guess
// that the simple explode won't work right
if (($last[strlen($last) - 1] == "\n"
&& $last[0] == $conf['quote']
&& $last[strlen(rtrim($last)) - 1] != $conf['quote'])
if (($last{strlen($last) - 1} == "\n"
&& $last{0} == $conf['quote']
&& $last{strlen(rtrim($last)) - 1} != $conf['quote'])
||
(count($fields) != $conf['fields'])
// XXX perhaps there is a separator inside a quoted field
@@ -511,4 +511,4 @@ class File_CSV
return true;
}
}
?>
?>
+5 -5
View File
@@ -96,7 +96,7 @@ class File_Util
{
if (File_Util::isAbsolute($path)) {
if (FILE_WIN32) {
return substr($path, $path[3] == '\\' ? 4 : 3);
return substr($path, $path{3} == '\\' ? 4 : 3);
}
return ltrim($path, '/');
}
@@ -182,7 +182,7 @@ class File_Util
if (FILE_WIN32) {
return preg_match('/^[a-zA-Z]:(\\\|\/)/', $path);
}
return ($path[0] == '/') || ($path[0] == '~');
return ($path{0} == '/') || ($path{0} == '~');
}
/**
@@ -244,11 +244,11 @@ class File_Util
} else {
$cwd = getcwd();
$drive = substr($cwd, 0, 2);
if ($path[0] !== $separator[0]) {
if ($path{0} !== $separator{0}) {
$path = substr($cwd, 3) . $separator . $path;
}
}
} elseif ($path[0] !== $separator) {
} elseif ($path{0} !== $separator) {
$path = getcwd() . $separator . $path;
}
@@ -323,7 +323,7 @@ class File_Util
$entries = array();
for ($dir = dir($path); false !== $entry = $dir->read(); ) {
if ($list & FILE_LIST_DOTS || $entry[0] !== '.') {
if ($list & FILE_LIST_DOTS || $entry{0} !== '.') {
$isRef = ($entry === '.' || $entry === '..');
$isDir = $isRef || is_dir($path .'/'. $entry);
if ( ((!$isDir && $list & FILE_LIST_FILES) ||
+1 -1
View File
@@ -240,7 +240,7 @@ class filter extends basis_db
{
//$value->value = preg_replace('/(.*?)selected=.selected./', '$1', $value->value);
//$value->value = preg_replace('/(.*?)\s*[selected=?selected?]/', '$1', $value->value);
//$value->value = preg_replace('/(.*?)\s*selected="selected"\s*/', '$[1]', $value->value);
//$value->value = preg_replace('/(.*?)\s*selected="selected"\s*/', '${1}', $value->value);
//$value->value = preg_replace('/^\s*selected=.*?selected.*?\s*/', ' ', $value->value);
//$value->value = str_replace('selected=', '', $value->value);
+1 -1
View File
@@ -1532,7 +1532,7 @@ class WavFile
} else {
// replace
for ($i = 0; $i < $sampleBytes; ++$i) {
$this->_samples[$offset + $i] = $sampleBinary[$i];
$this->_samples{$offset + $i} = $sampleBinary{$i};
}
}
+1 -1
View File
@@ -1435,7 +1435,7 @@ class Securimage
$length = strlen($code['display']);
for($i = 0; $i < $length; ++$i) {
$letter = $code['display'][$i];
$letter = $code['display']{$i};
$letters[] = $letter;
}
}
-5
View File
@@ -62,9 +62,6 @@ $this->phrasen['testtool/einfuehrungsText']='
<h1 style="white-space: normal">Herzlich Willkommen zum Reihungstest</h1>
<a href="'.APP_ROOT.'cms/dms.php?id=142964" target="_blank"><img src="'.APP_ROOT.'cms/dms.php?id=142976" alt="Einfuehrungsvideo" style="border: 1px solid lightgray; border-radius: 10px; width:350px;"></a>
<br><br>
<a href="'.APP_ROOT.'cms/dms.php?id=330348" target="_blank"><img src="'.APP_ROOT.'cms/dms.php?id=46&version=1">&nbsp;<b>Bachelor</b>-Leitfaden zum Ablauf des Reihungstests</a><br>
<a href="'.APP_ROOT.'cms/dms.php?id=275533" target="_blank"><img src="'.APP_ROOT.'cms/dms.php?id=46&version=1">&nbsp;<b>Master</b>-Leitfaden zum Ablauf des Reihungstests</a>
<br><br>
Unter dem folgenden Link können Sie die korrekte Darstellung des Reihungstests testen:<br><br>
<a href="../public/testtool_test/testseite.php" target="_blank" class="btn btn-default">Zum Darstellungstest</a>
</div>
@@ -72,8 +69,6 @@ $this->phrasen['testtool/einfuehrungsText']='
<h1 style="white-space: normal">Welcome to the placement test</h1>
<a href="'.APP_ROOT.'cms/dms.php?id=145596" target="_blank"><img src="'.APP_ROOT.'cms/dms.php?id=142977" alt="Einfuehrungsvideo" style="border: 1px solid lightgray; border-radius: 10px; width:350px;"></a>
<br><br>
<a href="'.APP_ROOT.'cms/dms.php?id=143930" target="_blank"><img src="'.APP_ROOT.'cms/dms.php?id=46&version=1">&nbsp;<b>Master</b>-Guideline for placement test</a>
<br><br>
Under the following link you can test the correct display of the placement test:<br><br>
<a href="../public/testtool_test/testseite.php" target="_blank" class="btn btn-default">Display testpage</a>
</div>
+1 -2
View File
@@ -407,7 +407,6 @@ html {
background-color: var(--fhc-background);
border-color: var(--fhc-border);
padding: var(--fhc-cis-main-py) var(--fhc-cis-main-px);
min-width: 0; /* fix flex-grow with tabulator exceeding width */
}
#cis-main .fa-arrow-up-right-from-square {
@@ -855,4 +854,4 @@ html {
#cis-main .modal-footer {
background-color: var(--fhc-secondary);
}
}
+1 -25
View File
@@ -11,24 +11,6 @@
html {
font-size: .875em;
}
html.fs_xx-small {
font-size: .5em;
}
html.fs_x-small {
font-size: .625em;
}
html.fs_small {
font-size: .75em;
}
html.fs_normal {
font-size: .875em;
}
html.fs_big {
font-size: 1em;
}
html.fs_huge {
font-size: 1.125em;
}
#appMenu {
width: 300px;
@@ -61,12 +43,6 @@ html.fs_huge {
flex: 1 1 auto;
}
#nav-user-btn img {
object-fit: contain;
height: 2.5rem;
width: 2.5rem;
}
.tabulator-row.disabled.tabulator-row-odd .tabulator-cell {
color: var(--gray-400);
}
@@ -184,4 +160,4 @@ html.fs_huge {
.tiny-90 div.tox.tox-tinymce {
height: 90% !important;
}
}
-4
View File
@@ -16,15 +16,11 @@
padding: .5rem 1rem;
text-decoration: none;
}
.fhc-app-menu li a.disabled {
--bs-link-opacity: .5;
}
.fhc-app-menu li a.active,
.fhc-app-menu li a:hover {
--bs-link-color-rgb: var(--bs-link-hover-color-rgb);
background: var(--surface-hover);
}
.fhc-app-menu li a.disabled,
.fhc-app-menu li a.active {
pointer-events: none;
}
+1 -7
View File
@@ -95,12 +95,6 @@
.modificationdate {
font-style: italic;
font-size: 1em;
font-size: 0.7em;
text-align: left;
}
.copy-btn {
float: right;
margin-top: 3px;
}
+3 -9
View File
@@ -62,10 +62,10 @@ export default {
url: 'api/frontend/v1/messages/messages/getUid/' + userParams.id + '/' + userParams.type_id
};
},
getDataVorlage(vorlage_kurzbz, studiengang_kz){
getDataVorlage(vorlage_kurzbz){
return {
method: 'get',
url: 'api/frontend/v1/messages/messages/getDataVorlage/' + vorlage_kurzbz + '/' + studiengang_kz
url: 'api/frontend/v1/messages/messages/getDataVorlage/' + vorlage_kurzbz
};
},
getNameOfDefaultRecipient(params){
@@ -106,11 +106,5 @@ export default {
method: 'post',
url: 'api/frontend/v1/messages/messages/deleteMessage/' + messageId
};
},
getStudiengang(userParams){
return {
method: 'get',
url: 'api/frontend/v1/messages/messages/getStudiengang/' + userParams.id + '/' + userParams.type_id
};
},
}
}
-32
View File
@@ -1,32 +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 {
get() {
return {
method: 'get',
url: 'api/frontend/v1/stv/config/get'
};
},
set(params) {
return {
method: 'post',
url: 'api/frontend/v1/stv/config/set',
params
};
}
};
-8
View File
@@ -46,14 +46,6 @@ export default {
url: url
};
},
search(params, studiensemester_kurzbz) {
return {
method: 'post',
url: 'api/frontend/v1/stv/students/search/'
+ encodeURIComponent(studiensemester_kurzbz),
params
};
},
verband(relative_path) {
return {
method: 'get',
+5 -5
View File
@@ -37,20 +37,20 @@ export default {
/*------------- details -------- */
getBenutzerSearch(query)
getAll()
{
return {
method: 'get',
url: `/api/frontend/v1/lv/gruppe/getBenutzerSearch?query=${encodeURIComponent(query)}`
url: '/api/frontend/v1/lv/gruppe/getAll/'
};
},
getAllSearch(query)
getBenutzer()
{
return {
method: 'get',
url: `/api/frontend/v1/lv/gruppe/getAllSearch?query=${encodeURIComponent(query)}`
url: '/api/frontend/v1/lv/gruppe/getBenutzer/'
};
},
}
}
+3 -2
View File
@@ -8,11 +8,12 @@ export default {
};
},
getLektorenSearch(query)
getLektoren()
{
return {
method: 'get',
url: `/api/frontend/v1/lv/lektor/getLektorenSearch?query=${encodeURIComponent(query)}`
url: '/api/frontend/v1/lv/lektor/getLektoren/'
};
},
-38
View File
@@ -148,44 +148,6 @@ const router = VueRouter.createRouter({
next();
}
},
{
name: 'search',
path: `/${ciPath}/studentenverwaltung/:studiensemester_kurzbz/search/:searchstr`,
component: FhcStudentenverwaltung,
props(route) {
return {
url_studiensemester_kurzbz: route.params.studiensemester_kurzbz,
url_mode: 'search',
url_prestudent_id: route.params.searchstr
};
},
beforeEnter(to, from, next) {
const isSemester = /^[WS]S\d{4}$/.test(to.params.studiensemester_kurzbz);
if (!isSemester) {
return next({name: 'index'});
}
next();
}
},
{
name: 'search_w_types',
path: `/${ciPath}/studentenverwaltung/:studiensemester_kurzbz/search/:types/:searchstr`,
component: FhcStudentenverwaltung,
props(route) {
return {
url_studiensemester_kurzbz: route.params.studiensemester_kurzbz,
url_mode: 'search',
url_prestudent_id: route.params.type + '/' + route.params.searchstr
};
},
beforeEnter(to, from, next) {
const isSemester = /^[WS]S\d{4}$/.test(to.params.studiensemester_kurzbz);
if (!isSemester) {
return next({name: 'index'});
}
next();
}
},
{
path: '/:pathMatch(.*)*',
redirect: {
-135
View File
@@ -1,135 +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/>.
*/
import BsModal from "./Bootstrap/Modal.js";
import FhcForm from "./Form/Form.js";
import FormInput from "./Form/Input.js";
export default {
name: 'AppConfig',
components: {
BsModal,
FhcForm,
FormInput
},
emits: [
'update:modelValue'
],
props: {
modelValue: {
type: Object,
required: true
},
endpoints: {
type: Object,
required: true
}
},
data() {
return {
setup: {},
tempValues: {}
};
},
watch: {
'$p.user_language.value'(n, o) {
if (n !== o && o !== undefined && Object.keys(this.setup).length) {
this.$api
.call(this.endpoints.get())
.then(res => {
this.setup = {};
Object.keys(res.data).forEach(key => {
const binding = { ...res.data[key] };
delete binding.value;
delete binding.options;
const options = res.data[key].options;
this.setup[key] = {
binding,
options
};
});
})
.catch(this.$fhcAlert.handleSystemErrors);
}
}
},
methods: {
update() {
this.$refs.form
.call(this.endpoints.set(this.tempValues))
.then(() => {
this.$emit('update:modelValue', { ...this.tempValues });
this.$refs.modal.hide();
this.$fhcAlert.alertSuccess(this.$p.t('ui/settings_saved'));
})
.catch(this.$fhcAlert.handleSystemErrors);
}
},
created() {
this.$api
.call(this.endpoints.get())
.then(res => {
Object.keys(res.data).forEach(key => {
const binding = { ...res.data[key] };
delete binding.value;
delete binding.options;
const options = res.data[key].options;
this.tempValues[key] = res.data[key].value;
this.setup[key] = {
binding,
options
};
});
this.$emit('update:modelValue', { ...this.tempValues });
})
.catch(this.$fhcAlert.handleSystemErrors);
},
template: /* html */`
<fhc-form class="stv-config" ref="form" @submit.prevent="update">
<bs-modal
ref="modal"
class="fade"
id="configModal"
dialog-class="modal-lg"
@hidden-bs-modal="tempValues = { ...modelValue }"
>
<template #title>{{ $p.t('ui/settings') }}</template>
<template #default>
<div class="d-flex flex-column gap-5">
<form-input
v-for="(value, key) in setup"
v-model="tempValues[key]"
v-bind="value.binding"
>
<option
v-for="(label, val) in value.options"
:key="val"
:value="val"
>{{ label }}</option>
</form-input>
</div>
</template>
<template #footer>
<button class="btn btn-primary" type="submit">
{{ $p.t('ui/speichern') }}
</button>
</template>
</bs-modal>
</fhc-form>`
};
-1
View File
@@ -64,6 +64,5 @@ export default {
{{ menu.description }}
</a>
</li>
<slot />
</ul>`
};
+1 -1
View File
@@ -316,7 +316,7 @@ export default {
template: /* html */`
<div
class="fhc-calendar-base-grid"
style="display:grid;width:100%;height:100%;overflow:auto"
style="display:grid;width:100%;height:100%"
:style="'grid-template-' + axisRow + 's:auto' + (allDayEvents ? ' auto ' : ' ') + '1fr;grid-template-' + axisCol + 's:auto ' + styleGridCols"
>
<div
@@ -2,7 +2,6 @@ import {CoreFilterCmpt} from "../../filter/Filter.js";
import FormForm from '../../Form/Form.js';
import FormInput from '../../Form/Input.js';
import ApiDirektGruppe from "../../../api/lehrveranstaltung/direktgruppe.js";
import ApiGruppe from "../../../api/lehrveranstaltung/gruppe.js";
export default{
name: "LVDirektGruppen",
components: {
@@ -62,9 +61,11 @@ export default{
lastSelected: null,
gruppen: [],
tabulatorEvents: [],
showAutocomplete: false,
selectedUser: null,
filteredUsers: [],
abortController: null,
searchTimeout: null,
}
},
watch: {
@@ -96,36 +97,18 @@ export default{
},
searchUser(event)
{
const query = event.query.trim();
if (!query)
{
this.filteredUsers = [];
return;
}
const query = event.query.toLowerCase().trim();
this.filteredUsers = this.dropdowns.benutzer_array.filter(user => {
if (query.length < 2)
{
return;
}
if (this.abortController)
{
this.abortController.abort();
}
this.abortController = new AbortController();
const signal = this.abortController.signal;
this.$api.call(ApiGruppe.getBenutzerSearch(query), { signal })
.then(result => {
this.filteredUsers = result.data.map(user => ({
label: user.studiengang
? `${user.nachname} ${user.vorname} ${user.uid} ${user.studiengang} ${user.semester}`
: `${user.nachname} ${user.vorname} ${user.uid}`,
uid: user.uid
})
)})
.catch(this.$fhcAlert.handleSystemError)
const fullName = `${user.vorname.toLowerCase()} ${user.nachname.toLowerCase()}`;
const reverseFullName = `${user.nachname.toLowerCase()} ${user.vorname.toLowerCase()}`;
return fullName.includes(query) || reverseFullName.includes(query) || user.uid.toLowerCase().includes(query) || user.studiengang.toLowerCase().includes(query);
}).map(user => ({
label: user.studiengang
? `${user.nachname} ${user.vorname} ${user.uid} ${user.studiengang} ${user.semester}`
: `${user.nachname} ${user.vorname} ${user.uid}`,
uid: user.uid
}));
},
addUser()
{
@@ -149,15 +132,19 @@ export default{
table-only
:side-menu="false"
:reload=true
:new-btn-label="$p.t('lehre', 'assignPerson')"
new-btn-show
@click:new="showAutocomplete = !showAutocomplete"
>
<template #search> <!--TODO (david) Slot prüfen -->
<form-input
v-if="showAutocomplete"
type="autocomplete"
:suggestions="filteredUsers"
:placeholder="$p.t('lehre', 'assignPerson')"
v-model="selectedUser"
field="label"
:minLength="2"
:minLength="3"
@item-select="addUser"
@complete="searchUser"
></form-input>
@@ -26,6 +26,16 @@ export default {
default: true
}
},
computed: {
formattedAnmerkung: {
get() {
return (this.data.anmerkung || '').replace(/\\n/g, '\n');
},
set(value) {
this.data.anmerkung = (value || '').replace(/\n/g, '\\n');
}
}
},
template: `
<div>
<div class="row mb-3">
@@ -64,7 +74,7 @@ export default {
:label="$p.t('lehre', 'detailanmerkung')"
type="textarea"
container-class="col-3"
v-model="data.anmerkung"
v-model="formattedAnmerkung"
name="anmerkung"
id="anmerkung"
rows="10"
@@ -88,9 +88,9 @@ export default{
data() {
return{
tabulatorEvents: [],
showAutocomplete: false,
filteredGroups: [],
selectedGroup: null,
abortController: null
selectedGroup: null
}
},
watch: {
@@ -99,42 +99,19 @@ export default{
}
},
methods:{
async searchGroup(event)
searchGroup(event)
{
const query = event.query.trim();
if (!query)
{
this.filteredLektor = [];
return;
}
if (query.length < 2)
{
return;
}
if (this.abortController)
{
this.abortController.abort();
}
this.abortController = new AbortController();
const signal = this.abortController.signal;
this.$api.call(ApiGruppe.getAllSearch(query), { signal })
.then(result => {
this.filteredGroups = result.data.map(gruppe => ({
label: gruppe.bezeichnung
? `${gruppe.gruppe_kurzbz.trim()} (${gruppe.bezeichnung})`
: gruppe.gruppe_kurzbz.trim(),
gid: gruppe.gid,
gruppe_kurzbz: gruppe.gruppe_kurzbz.trim(),
lehrverband: gruppe.lehrverband,
})
)})
.catch(this.$fhcAlert.handleSystemError)
const query = event.query.toLowerCase().trim();
this.filteredGroups = this.dropdowns.gruppen_array.filter(gruppe => {
return gruppe.gruppe_kurzbz.toLowerCase().includes(query) || gruppe?.bezeichnung?.toLowerCase().includes(query);
}).map(gruppe => ({
label: gruppe.bezeichnung
? `${gruppe.gruppe_kurzbz.trim()} (${gruppe.bezeichnung})`
: gruppe.gruppe_kurzbz.trim(),
gid: gruppe.gid,
gruppe_kurzbz: gruppe.gruppe_kurzbz.trim(),
lehrverband: gruppe.lehrverband,
}));
},
reload() {
this.$refs.table.reloadTable();
@@ -196,9 +173,13 @@ export default{
table-only
:side-menu="false"
:reload=true
:new-btn-label="$p.t('lehre', 'addGroup')"
new-btn-show
@click:new="showAutocomplete = !showAutocomplete"
>
<template #search> <!--TODO (david) Slot prüfen -->
<form-input
v-if="showAutocomplete"
type="autocomplete"
:suggestions="filteredGroups"
:placeholder="$p.t('lehre', 'addGroup')"
@@ -41,7 +41,7 @@ export default {
dropdowns: this.dropdowns,
configShowVertragsdetails: this.config.showVertragsdetails,
configShowGewichtung: this.config.showGewichtung,
lehreinheitAnmerkungDefault: (this.config.lehreinheitAnmerkungDefault || '').replace(/\\n/g, '\n'),
lehreinheitAnmerkungDefault: this.config.lehreinheitAnmerkungDefault,
lehreinheitRaumtypDefault: this.config.lehreinheitRaumtypDefault,
lehreinheitRaumtypAlternativeDefault: this.config.lehreinheitRaumtypAlternativeDefault,
@@ -82,6 +82,9 @@ export default {
sprachen_array: [],
lehrform_array: [],
raumtyp_array: [],
lektor_array: [],
gruppen_array: [],
benutzer_array: [],
},
selectedStudiengang: '',
searchbaroptions: {
@@ -124,10 +127,6 @@ export default {
? `${this.stg}/${this.semester}`
: this.stg;
}
else
{
this.selectedStudiengang = '';
}
this.filter = filter;
},
handleRowClicked(data)
@@ -167,7 +166,6 @@ export default {
const routeName = this.filter.emp ? 'byEmp' : 'byStg';
const params = { stg };
params.semester = '';
if (semester !== null)
params.semester = semester;
if (studiensemester_kurzbz)
@@ -189,13 +187,6 @@ export default {
this.$router.replace({ name: 'byStg', params: newParams });
}
},
resetStgFilter()
{
const newParams = { ...this.filter, activeFilter: 'emp' };
delete newParams.stg;
this.selectedStudiengang = '';
this.$router.replace({ name: 'byEmp', params: newParams });
},
searchfunction(params) {
return this.$api.call(ApiSearchbar.search(params));
},
@@ -238,6 +229,24 @@ export default {
this.dropdowns.lehrfunktion_array = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
this.$api.call(ApiLektor.getLektoren())
.then(result => {
this.dropdowns.lektor_array = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
this.$api.call(ApiGruppe.getAll())
.then(result => {
this.dropdowns.gruppen_array = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
this.$api.call(ApiGruppe.getBenutzer())
.then(result => {
this.dropdowns.benutzer_array = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
template: /* html */`
@@ -298,25 +307,12 @@ export default {
:filter="filter"
>
<template #filterzuruecksetzen v-if="filter.activeFilter === 'employee'">
<span class="fw-bold small">
[{{ $p.t('lehre', 'lektor') }}: {{ filter.emp || '' }}
<button type="button"
class="btn btn-outline-secondary btn-action btn-sm ms-1"
:title="$p.t('ui', 'filterdelete')"
@click="resetEmployeeFilter">
<button type="button"
class="btn btn-outline-secondary btn-action"
title="Mitarbeiter Filter entfernen"
@click="resetEmployeeFilter">
<i class="fa fa-xmark"></i>
</button>
<template v-if="filter.stg">
| Stg: {{ filter.stg }}
<button type="button"
class="btn btn-outline-secondary btn-action btn-sm ms-1"
:title="$p.t('ui', 'filterdelete')"
@click="resetStgFilter">
<i class="fa fa-xmark"></i>
</button>
</template>
]
</span>
</template>
</lv-table>
</template>
@@ -31,8 +31,6 @@ export default{
changed: {},
internal_mitarbeiter_uid: null,
filteredLektor: [],
abortController: null,
selectedLektorLabel: ''
}
},
computed: {
@@ -65,10 +63,7 @@ export default{
this.internal_mitarbeiter_uid = newVal;
if (newVal === null)
{
this.data = null;
this.selectedLektorLabel = '';
}
else if (newVal !== undefined && this.lehreinheit_id !== undefined)
this.getLektorData();
}
@@ -104,15 +99,10 @@ export default{
return this.$api.call(ApiLektor.getLektorDaten(this.lehreinheit_id, this.internal_mitarbeiter_uid))
.then(result => {
this.data = result.data;
this.selectedLektorLabel = `${this.data.nachname} ${this.data.vorname} (${this.data.mitarbeiter_uid})`,
this.original = { ...this.data };
})
.catch(this.$fhcAlert.handleSystemError);
},
onLektorSelected(selectedLektor)
{
this.data.mitarbeiter_uid = selectedLektor.value.uid;
},
updateDaten()
{
if (!this.changedLength)
@@ -149,37 +139,17 @@ export default{
})
.catch(this.$fhcAlert.handleSystemError);
},
async searchLektor(event)
searchLektor(event)
{
const query = event.query.trim();
if (!query)
{
this.filteredLektor = [];
return;
}
if (query.length < 2)
{
return;
}
if (this.abortController)
{
this.abortController.abort();
}
this.abortController = new AbortController();
const signal = this.abortController.signal;
this.$api.call(ApiLektor.getLektorenSearch(query), { signal })
.then(result => {
this.filteredLektor = result.data.map(lektor => ({
label: `${lektor.nachname} ${lektor.vorname} (${lektor.uid})`,
uid: lektor.uid
})
)})
.catch(this.$fhcAlert.handleSystemError)
const query = event.query.toLowerCase().trim();
this.filteredLektor = this.dropdowns.lektor_array.filter(lektor => {
const fullName = `${lektor.vorname.toLowerCase()} ${lektor.nachname.toLowerCase()}`;
const reverseFullName = `${lektor.nachname.toLowerCase()} ${lektor.vorname.toLowerCase()}`;
return fullName.includes(query) || reverseFullName.includes(query) || lektor.uid.toLowerCase().includes(query);
}).map(lektor => ({
label: `${lektor.nachname} ${lektor.vorname} (${lektor.uid})`,
uid: lektor.uid
}));
},
},
@@ -217,12 +187,11 @@ export default{
:disabled="data.vertrag_id !== null"
:suggestions="filteredLektor"
placeholder="Mitarbeiter hinzufügen"
v-model="selectedLektorLabel"
v-model="data.mitarbeiter_uid"
field="label"
container-class="col-3"
dropdown
@complete="searchLektor"
@item-select="onLektorSelected"
name="lektorautocomplete"
></form-input>
@@ -262,6 +231,7 @@ export default{
</div>
<div class="row mb-3 d-flex align-items-end">
<form-input
:label="data.default_stundensatz !== null
? $p.t('lehre', 'stundensatz') + ' (' + $p.t('lehre', 'default') + ': ' + data.default_stundensatz + ')'
@@ -276,23 +246,30 @@ export default{
>
</form-input>
<div class="col-3 d-flex align-items-end">
<form-input
:label="$p.t('lehre', 'bismelden')"
type="checkbox"
v-model="data.bismelden"
name="bismelden"
>
</form-input>
</div>
<form-input
:label="$p.t('lehre', 'bismelden')"
type="checkbox"
container-class="col-3"
v-model="data.bismelden"
name="bismelden"
>
</form-input>
</div>
<div class="d-flex mb-2 gap-2">
<span class="fw-bold">{{ $p.t('lehre', 'gesamtkosten') }}:</span>
<span :style="{ color: berechneteGesamtkosten <= 0 ? 'red' : 'black' }">
{{ berechneteGesamtkosten }}
</span>
<div class="row mb-3">
<form-input
:label="$p.t('lehre', 'gesamtkosten')"
type="number"
name="gesamtkosten"
container-class="col-3"
readonly
v-model="berechneteGesamtkosten"
:style="{ color: berechneteGesamtkosten <= 0 ? 'red' : 'black' }"
>
</form-input>
</div>
</template>
</fieldset>
@@ -3,6 +3,7 @@ import FormForm from '../../Form/Form.js';
import FormInput from '../../Form/Input.js';
import ApiLektor from "../../../api/lehrveranstaltung/lektor.js";
export default{
name: "LVLektorTable",
components: {
@@ -33,9 +34,9 @@ export default{
handler: this.lektorSelected
}
],
showAutocomplete: false,
filteredLektor: [],
selectedLektor: '',
abortController: null
selectedLektor: ''
}
},
computed: {
@@ -162,37 +163,17 @@ export default{
})
},
async searchLektor(event)
searchLektor(event)
{
const query = event.query.trim();
if (!query)
{
this.filteredLektor = [];
return;
}
if (query.length < 2)
{
return;
}
if (this.abortController)
{
this.abortController.abort();
}
this.abortController = new AbortController();
const signal = this.abortController.signal;
this.$api.call(ApiLektor.getLektorenSearch(query), { signal })
.then(result => {
this.filteredLektor = result.data.map(lektor => ({
label: `${lektor.nachname} ${lektor.vorname} (${lektor.uid})`,
uid: lektor.uid
})
)})
.catch(this.$fhcAlert.handleSystemError)
const query = event.query.toLowerCase().trim();
this.filteredLektor = this.dropdowns.lektor_array.filter(lektor => {
const fullName = `${lektor.vorname.toLowerCase()} ${lektor.nachname.toLowerCase()}`;
const reverseFullName = `${lektor.nachname.toLowerCase()} ${lektor.vorname.toLowerCase()}`;
return fullName.includes(query) || reverseFullName.includes(query) || lektor.uid.toLowerCase().includes(query);
}).map(lektor => ({
label: `${lektor.nachname} ${lektor.vorname} (${lektor.uid})`,
uid: lektor.uid
}));
},
addLektor()
{
@@ -218,9 +199,13 @@ export default{
table-only
:side-menu="false"
reload
:new-btn-label="$p.t('lehre', 'addLektor')"
new-btn-show
@click:new="showAutocomplete = !showAutocomplete"
>
<template #search> <!--TODO (david) Slot prüfen -->
<form-input
v-if="showAutocomplete"
type="autocomplete"
:suggestions="filteredLektor"
:placeholder="$p.t('lehre', 'addLektor')"
@@ -113,16 +113,23 @@ export default{
<core-form ref="form">
<fieldset class="overflow-hidden" v-if="showVertragsdetails">
<legend> {{$p.t('lehre', 'vertragsdetails')}}
{{ data?.vertrag === null ? ' ' + $p.t('lehre', 'keinvertrag') : '' }}
</legend>
{{ data === null ? ' Noch kein Vertrag' : '' }}
</legend>
<template v-if="data?.vertrag">
<div class="d-flex justify-content-between align-items-center mb-3 flex-wrap">
<div class="d-flex align-items-center flex-wrap gap-2">
<span class="fw-bold">{{ $p.t('lehre', 'vertragsstatus') }}:</span>
<span :class="{ 'fw-bold': vertragsstatus === 'Geändert' }">{{ vertragsstatus }}</span>
<button
type="button"
class="btn btn-outline-secondary btn-sm"
<div class="row align-items-end mb-3">
<form-input
:label="$p.t('lehre', 'vertragsstatus')"
type="text"
readonly
container-class="col-3"
v-model="vertragsstatus"
:style="{fontWeight: vertragsstatus === 'Geändert' ? 'bold' : 'normal'}"
name="vertragsstatus"
/>
<div class="col-3 d-flex align-items-end">
<button
type="button"
class="btn btn-outline-secondary w-100"
@click="cancelVertrag"
:title="$p.t('lehre', 'cancelvertrag')"
>
@@ -130,18 +137,28 @@ export default{
</button>
</div>
</div>
<div class="mb-2 fw-bold text-decoration-underline">
{{ $p.t('lehre', 'vertragurfassung') }}
{{$p.t('lehre', 'vertragurfassung')}}
<div class="row mb-3">
<form-input
:label="$p.t('lehre', 'semesterstunden')"
type="text"
container-class="col-3"
readonly
v-model="data.vertrag.vertragsstunden"
name="vertragsstunden"
>
</form-input>
</div>
<div class="ps-4">
<div class="d-flex mb-2 gap-2">
<span class="fw-bold">{{ $p.t('lehre', 'semesterstunden') }}:</span>
<span>{{ data.vertrag.vertragsstunden }}</span>
</div>
<div class="d-flex mb-2 gap-2">
<span class="fw-bold">{{ $p.t('lehre', 'studiensemester') }}:</span>
<span>{{ data.vertrag.vertragsstunden_studiensemester_kurzbz }}</span>
</div>
<div class="row mb-3">
<form-input
:label="$p.t('lehre', 'studiensemester')"
type="text"
container-class="col-3"
readonly
v-model="data.vertrag.vertragsstunden_studiensemester_kurzbz"
name="vertragsstunden_studiensemester_kurzbz"
>
</form-input>
</div>
</template>
</fieldset>
@@ -324,7 +324,7 @@ export default {
{title: this.$p.t('lehre', 'lehreinheit_id'), field: "lehreinheit_id", headerFilter: true, headerFilterFuncParams: {field: 'lehreinheit_id'}, visible: false},
{title: this.$p.t('lehre', 'studiensemester'), field: "studiensemester_kurzbz", headerFilter: true, headerFilterFuncParams: {field: 'studiensemester_kurzbz'}, visible: false},
{title: this.$p.t('lehre', 'unr'), field: "unr", headerFilter: true, headerFilterFuncParams: {field: 'unr'}, visible: false},
{title: this.$p.t('lehre', 'organisationseinheit'), field: "fachbereich", headerFilter: true, headerFilterFuncParams: {field: 'fachbereich'}, visible: false},
{title: this.$p.t('lehre', 'fachbereich'), field: "fachbereich", headerFilter: true, headerFilterFuncParams: {field: 'fachbereich'}, visible: false},
{title: this.$p.t('lehre', 'stundenblockung'), field: "stundenblockung", headerFilter: true, headerFilterFuncParams: {field: 'stundenblockung'}, visible: false},
{title: this.$p.t('lehre', 'wochenrhythmus'), field: "wochenrythmus", headerFilter: true, headerFilterFuncParams: {field: 'wochenrythmus'}, visible: false},
{title: this.$p.t('lehre', 'startkw'), field: "start_kw", headerFilter: true, headerFilterFuncParams: {field: 'startkw'}, visible: false},
@@ -563,54 +563,36 @@ export default {
this.allRows.forEach(row => {
if (row.getTreeChildren().length > 0 && row.isTreeExpanded())
{
this.expanded.push(row.getData().lv_bezeichnung);
this.expanded.push(row.getData().uniqueindex);
}
});
},
reexpandRows() {
this.allRows = this.getAllRows(this.$refs.table.tabulator.getRows());
let lastMatchingRow = null;
const matchingRows = this.allRows.filter(row =>
this.expanded.includes(row.getData().uniqueindex)
);
this.allRows.forEach(row => {
if (this.expanded.includes(row.getData().lv_bezeichnung))
if (matchingRows.length === 0)
this.currentTreeLevel = 0;
matchingRows.forEach((row, index) => {
row._row.modules.dataTree.open = true;
if (index === matchingRows.length - 1)
{
if (row._row.modules.dataTree)
{
row._row.modules.dataTree.open = true;
}
if (row._row.data._children?.length > 0)
{
lastMatchingRow = row;
}
row.treeExpand();
}
});
if (lastMatchingRow)
{
lastMatchingRow.treeExpand();
}
this.$refs.table.tabulator.redraw();
},
deleteLehreinheit(row)
{
let lehreinheit_id = row.getData().lehreinheit_id;
let is_selected = this.selectedColumnValues.length > 0 && this.selectedColumnValues.includes(lehreinheit_id);
let deleteData = is_selected ? {lehreinheit_id: [...new Set(this.selectedColumnValues)]} : {lehreinheit_id: lehreinheit_id};
let deleteData = {
lehreinheit_id: row.getData().lehreinheit_id,
}
return this.$api.call(ApiLehreinheit.delete(deleteData))
.then(result => {
if (result?.data?.errors)
{
result.data.errors.forEach(error => {
this.$fhcAlert.alertError(error)
})
}
this.reload()
})
.catch(this.$fhcAlert.handleSystemError);
@@ -642,7 +624,7 @@ export default {
},
expandTree()
{
this.currentTreeLevel = (this.currentTreeLevel || 1);
this.currentTreeLevel = (this.currentTreeLevel || 0) + 1;
let lastMatchingRow = null;
@@ -663,7 +645,6 @@ export default {
if (lastMatchingRow)
{
lastMatchingRow.treeExpand();
this.currentTreeLevel++;
}
this.$refs.table.tabulator.redraw();
},
@@ -682,8 +663,6 @@ export default {
@click:new="showLehreinheitModal">
<template #actions>
<button @click="expandTree" class="btn btn-outline-secondary" type="button" :title="$p.t('lehre', 'aufklappen')"><i class="fa-solid fa-maximize"></i></button>
<button @click="resetTree" class="btn btn-outline-secondary" type="button" :title="$p.t('lehre', 'zuklappen')"><i id="togglegroup" class="fa-solid fa-minimize"></i></button>
<core-tag ref="tagComponent"
:endpoint="tagEndpoint"
:values="selectedColumnValues"
@@ -692,6 +671,8 @@ export default {
@updated="updatedTag"
zuordnung_typ="lehreinheit_id"
></core-tag>
<button @click="expandTree" class="btn btn-outline-secondary" type="button"><i class="fa-solid fa-maximize"></i></button>
<button @click="resetTree" class="btn btn-outline-secondary" type="button"><i id="togglegroup" class="fa-solid fa-minimize"></i></button>
</template>
<template #search>
<slot name="filterzuruecksetzen"></slot>
@@ -57,7 +57,6 @@ export default {
previewBody: "",
replyData: null,
uid: null,
studiengang_kz: null
}
},
methods: {
@@ -137,9 +136,9 @@ export default {
}
);
},
getDataVorlage(vorlage_kurzbz, studiengang_kz){
getDataVorlage(vorlage_kurzbz){
return this.$api
.call(this.endpoint.getDataVorlage(vorlage_kurzbz, studiengang_kz))
.call(this.endpoint.getDataVorlage(vorlage_kurzbz))
.then(response => {
this.formData.body = response.data.text;
this.formData.subject = response.data.subject;
@@ -194,7 +193,7 @@ export default {
},
handleSelectedVorlage(vorlage_kurzbz) {
if (typeof vorlage_kurzbz === "string") {
this.getDataVorlage(vorlage_kurzbz, this.studiengang_kz);
this.getDataVorlage(vorlage_kurzbz);
}
},
showPreview(){
@@ -214,18 +213,6 @@ export default {
})
.catch(this.$fhcAlert.handleSystemError);
},
getStudiengang(id, typeId){
const params = {
id: id,
type_id: typeId
};
this.$api
.call(this.endpoint.getStudiengang(params))
.then(result => {
this.studiengang_kz = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
show(){
this.$refs.modalNewMessage.show();
},
@@ -248,7 +235,7 @@ export default {
handler(newVal){
if (newVal && newVal != null) {
this.formData.subject = newVal;
return this.getDataVorlage(newVal, this.studiengang_kz);
return this.getDataVorlage(newVal);
}
}
},
@@ -294,7 +281,6 @@ export default {
}
if(this.typeId == 'prestudent_id' || this.typeId == 'uid'){
this.getStudiengang(this.id, this.typeId);
const params = {
id: this.id,
type_id: this.typeId
@@ -304,7 +290,6 @@ export default {
.then(result => {
this.fieldsPrestudent = result.data;
const prestudent = this.fieldsPrestudent[0];
//this.studiengang_kz = prestudent.Studiengangskennzahl;
this.itemsPrestudent = Object.entries(prestudent).map(([key, value]) => ({
label: key.toLowerCase(),
value: '{' + key.toLowerCase() + '}'
@@ -68,8 +68,7 @@ export default {
previewBody: "",
replyData: null,
uid: null,
messageSent: false,
studiengang_kz: null
messageSent: false
}
},
methods: {
@@ -137,9 +136,9 @@ export default {
}
);
},
getDataVorlage(vorlage_kurzbz, studiengang_kz){
getDataVorlage(vorlage_kurzbz){
return this.$api
.call(this.endpoint.getDataVorlage(vorlage_kurzbz, studiengang_kz))
.call(this.endpoint.getDataVorlage(vorlage_kurzbz))
.then(response => {
this.formData.body = response.data.text;
this.formData.subject = response.data.subject;
@@ -192,7 +191,7 @@ export default {
},
handleSelectedVorlage(vorlage_kurzbz) {
if (typeof vorlage_kurzbz === "string") {
this.getDataVorlage(vorlage_kurzbz, this.studiengang_kz);
this.getDataVorlage(vorlage_kurzbz);
}
},
hideTemplate(){
@@ -219,19 +218,7 @@ export default {
this.uid = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
getStudiengang(id, typeId){
const params = {
id: id,
type_id: typeId
};
this.$api
.call(this.endpoint.getStudiengang(params))
.then(result => {
this.studiengang_kz = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
}
},
watch: {
'formData.body': {
@@ -249,7 +236,7 @@ export default {
if (newVal && newVal != null) {
this.formData.subject = newVal;
return this.getDataVorlage(newVal, this.studiengang_kz);
return this.getDataVorlage(newVal);
}
}
},
@@ -277,7 +264,6 @@ export default {
}
if (['prestudent_id', 'uid'].includes(this.typeId)){
this.getStudiengang(this.id, this.typeId);
const params = {
id: this.id,
type_id: this.typeId
@@ -132,10 +132,9 @@ export default {
frozen: true
}
],
layout: 'fitDataStretchFrozen',
layout: 'fitDataFill',
layoutColumnsOnNewData: false,
height: '400',
selectable: 1,
selectableRangeMode: 'click',
index: 'message_id',
pagination: true,
@@ -148,7 +147,7 @@ export default {
dataTreeCollapseElement:"<i class='fas fa-minus-square'></i>",
dataTreeChildIndent: 15,
dataTreeStartExpanded: false,
persistenceID: 'core-message-2025112401',
persistenceID: 'core-message',
locale: 'de',
"langs": {
"de":{ //German language definition
+12 -231
View File
@@ -16,10 +16,8 @@
*/
import CoreSearchbar from "../searchbar/searchbar.js";
import NavLanguage from "../navigation/Language.js";
import VerticalSplit from "../verticalsplit/verticalsplit.js";
import AppMenu from "../AppMenu.js";
import AppConfig from "../AppConfig.js";
import StvVerband from "./Studentenverwaltung/Verband.js";
import StvList from "./Studentenverwaltung/List.js";
import StvDetails from "./Studentenverwaltung/Details.js";
@@ -28,17 +26,14 @@ import StvStudiensemester from "./Studentenverwaltung/Studiensemester.js";
import ApiSearchbar from "../../api/factory/searchbar.js";
import ApiStv from "../../api/factory/stv.js";
import ApiStvVerband from '../../api/factory/stv/verband.js';
import ApiStvConfig from '../../api/factory/stv/config.js';
export default {
name: 'Studentenverwaltung',
components: {
CoreSearchbar,
NavLanguage,
VerticalSplit,
AppMenu,
AppConfig,
StvVerband,
StvList,
StvDetails,
@@ -50,8 +45,6 @@ export default {
permissions: Object,
stvRoot: String,
cisRoot: String,
avatarUrl: String,
logoutUrl: String,
activeAddons: String, // semicolon separated list of active addons
url_studiensemester_kurzbz: String,
url_mode: String,
@@ -83,19 +76,15 @@ export default {
},
configShowAufnahmegruppen: this.config.showAufnahmegruppen,
configAllowUebernahmePunkte: this.config.allowUebernahmePunkte,
configUseReihungstestPunkte: this.config.useReihungstestPunkte,
appConfig: Vue.computed(() => this.appconfig)
configUseReihungstestPunkte: this.config.useReihungstestPunkte
}
},
data() {
return {
appconfig: {},
configEndpoints: ApiStvConfig,
selected: [],
searchbaroptions: {
origin: 'stv',
calcheightonly: true,
nolivesearch: true,
types: {
student: Vue.computed(() => this.$p.t('search/type_student')),
prestudent: Vue.computed(() => this.$p.t('search/type_prestudent'))
@@ -134,8 +123,6 @@ export default {
studiengangKz: undefined,
studiengangKuerzel: '',
studiensemesterKurzbz: this.defaultSemester,
selected_semester: undefined,
selected_orgform: undefined,
lists: {
nations: [],
sprachen: [],
@@ -144,60 +131,12 @@ export default {
verbandEndpoint: ApiStvVerband
}
},
computed: {
appMenuExtraItems() {
const extraItems = [];
if (this.studiengangKz !== undefined && this.selected_semester !== undefined) {
const studiengang_kz = String(this.studiengangKz);
const semester = String(this.selected_semester);
const orgform = this.selected_orgform || '';
extraItems.push({
link: FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'content/statistik/notenspiegel.php?typ=xls'
+ '&studiengang_kz=' + studiengang_kz
+ '&semester=' + semester
+ '&studiensemester=' + this.studiensemesterKurzbz
+ '&orgform=' + orgform,
description: 'stv/grade_report_xls'
});
extraItems.push({
link: FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'content/statistik/notenspiegel_erweitert.php?typ=xls'
+ '&studiengang_kz=' + studiengang_kz
+ '&semester=' + semester
+ '&studiensemester=' + this.studiensemesterKurzbz
+ '&orgform=' + orgform,
description: 'stv/grade_report_xls_extended'
});
extraItems.push({
link: FHC_JS_DATA_STORAGE_OBJECT.app_root
+ 'content/statistik/notenspiegel.php?typ=html'
+ '&studiengang_kz=' + studiengang_kz
+ '&semester=' + semester
+ '&studiensemester=' + this.studiensemesterKurzbz
+ '&orgform=' + orgform,
description: 'stv/grade_report_html'
});
}
return extraItems;
}
},
watch: {
'url_studiensemester_kurzbz': function (newVal, oldVal) {
if (newVal !== oldVal) {
this.studiensemesterKurzbz = newVal;
if(this.$route.name === 'search')
{
this.handleSearchUrl();
}
else
{
this.$refs.stvList.updateUrl();
this.$refs.details.reload();
}
this.$refs.stvList.updateUrl();
this.$refs.details.reload();
}
},
'url_studiengang': function (newVal, oldVal) {
@@ -207,25 +146,6 @@ export default {
},
'url_mode': function () {
this.handlePersonUrl();
},
url_prestudent_id() {
this.handlePersonUrl();
},
'appconfig.font_size'() {
// add to html class
const classList = Object.keys(this.$refs.config.setup.font_size.options);
classList.forEach(cn => document.documentElement.classList.remove(cn));
document.documentElement.classList.add(this.appconfig.font_size);
// recalc Tabulator heights
if (this.$el) {
const tabulatorEls = this.$el.querySelectorAll('.tabulator');
for (const el of tabulatorEls) {
const tabulators = Tabulator.findTable(el);
if (tabulators) {
tabulators[0].searchRows().forEach(row => row.normalizeHeight());
}
}
}
}
},
methods: {
@@ -239,7 +159,7 @@ export default {
}
},
buildPrestudentSearchResultLink(data) {
return this.$api.getUri(
return this.$fhcApi.getUri(
'/studentenverwaltung'
+ '/' + this.studiensemesterKurzbz
+ '/prestudent/'
@@ -247,7 +167,7 @@ export default {
);
},
buildStudentSearchResultLink(data) {
return this.$api.getUri(
return this.$fhcApi.getUri(
'/studentenverwaltung'
+ '/' + this.studiensemesterKurzbz
+ '/student/'
@@ -255,14 +175,14 @@ export default {
);
},
buildPersonSearchResultLink(data) {
return this.$api.getUri(
return this.$fhcApi.getUri(
'/studentenverwaltung'
+ '/' + this.studiensemesterKurzbz
+ '/person/'
+ data.person_id
);
},
onSelectVerband({ link, studiengang_kz, semester, orgform_kurzbz }) {
onSelectVerband( {link, studiengang_kz}) {
let urlpath = String(link);
if (!urlpath.match(/\/prestudent/))
{
@@ -271,8 +191,6 @@ export default {
this.$refs.stvList.updateUrl(ApiStv.students.verband(urlpath));
this.studiengangKz = studiengang_kz;
this.selected_semester = semester;
this.selected_orgform = orgform_kurzbz;
const stg = this.lists.stgs.find((element) => {
return (element.studiengang_kz === this.studiengangKz);
});
@@ -305,6 +223,9 @@ export default {
studiensemester_kurzbz: v
}
});
this.$refs.stvList.updateUrl();
this.$refs.details.reload();
},
reloadList() {
this.$refs.stvList.reload();
@@ -328,37 +249,6 @@ export default {
ApiStv.students.person(this.$route.params.person_id, 'CURRENT_SEMESTER'),
true
);
} else if (this.$route.params.searchstr) {
this.handleSearchUrl();
}
else
{
this.clearTabulator();
}
},
handleSearchUrl() {
const searchsettings = {
searchstr: this.$route.params.searchstr,
types: this.$route.params.types?.split('+') || []
};
// init into student list
this.$refs.stvList.updateUrl(
ApiStv.students.search(searchsettings, this.studiensemesterKurzbz)
);
// init into searchbar
this.$refs.searchbar.searchsettings.searchstr = searchsettings.searchstr;
this.$refs.searchbar.searchsettings.types = searchsettings.types;
this.$nextTick(this.blurSearchbar);
},
clearTabulator() {
if(['index', 'studiensemester'].includes(this.$route.name))
{
if(this.$refs?.stvList?.$refs?.table?.tabulator)
{
this.$refs.stvList.$refs.table.tabulator.setData([]);
}
}
},
checkUrlStudiengang() {
@@ -379,42 +269,6 @@ export default {
});
}
}
else
{
this.studiengangKz = undefined;
this.studiengangKuerzel = '';
this.clearTabulator();
}
},
onSearch(e) {
const searchsettings = { ...this.$refs.searchbar.searchsettings };
if (searchsettings.searchstr.length >= 2) {
this.blurSearchbar();
if (!searchsettings.types.length || searchsettings.types.length == this.$refs.searchbar.types.length) {
this.$router.push({
name: 'search',
params: {
studiensemester_kurzbz: this.studiensemesterKurzbz,
searchstr: searchsettings.searchstr
}
});
} else {
this.$router.push({
name: 'search_w_types',
params: {
studiensemester_kurzbz: this.studiensemesterKurzbz,
searchstr: searchsettings.searchstr,
types: searchsettings.types.join('+')
}
});
}
}
},
blurSearchbar() {
this.$refs.searchbar.$refs.input.blur();
this.$refs.searchbar.abort();
this.$refs.searchbar.hideresult();
}
},
created() {
@@ -522,58 +376,10 @@ export default {
<span class="fa-solid fa-table-list"></span>
</button>
<core-searchbar
ref="searchbar"
:searchoptions="searchbaroptions"
:searchfunction="searchfunction"
class="searchbar position-relative w-100"
show-btn-submit
@submit.prevent="onSearch"
></core-searchbar>
<div id="nav-user" class="dropdown">
<button
id="nav-user-btn"
class="btn btn-link rounded-0 py-0"
type="button"
data-bs-toggle="dropdown"
data-bs-target="#nav-user-menu"
aria-expanded="false"
aria-controls="nav-user-menu"
>
<img
:src="avatarUrl"
:alt="$p.t('profilUpdate/profilBild')"
class="bg-light avatar rounded-circle border border-light"
/>
</button>
<ul
ref="navUserDropdown"
class="dropdown-menu dropdown-menu-dark dropdown-menu-end rounded-0 text-center m-0"
aria-labelledby="nav-user-btn"
>
<li>
<button
type="button"
class="dropdown-item"
data-bs-toggle="modal"
data-bs-target="#configModal"
>
{{ $p.t('ui/settings') }}
</button>
</li>
<li><hr class="dropdown-divider m-0"/></li>
<li>
<nav-language
item-class="dropdown-item border-left-dark"
/>
</li>
<li><hr class="dropdown-divider m-0"/></li>
<li>
<a class="dropdown-item" :href="logoutUrl">
{{ $p.t('ui/logout') }}
</a>
</li>
</ul>
</div>
</header>
<div class="container-fluid overflow-hidden">
<div class="row h-100">
@@ -583,38 +389,14 @@ export default {
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" :aria-label="$p.t('ui/schliessen')"></button>
</div>
<div class="offcanvas-body">
<app-menu app-identifier="stv">
<li class="dropend">
<a
class="dropdown-toggle"
href="#"
role="button"
data-bs-toggle="dropdown"
aria-expanded="false"
:class="{ disabled: !appMenuExtraItems.length }"
data-bs-popper-config='{"strategy":"fixed"}'
>
{{ $p.t('stv/grade_report') }}
</a>
<ul class="dropdown-menu p-0">
<li
v-for="(item, key) in appMenuExtraItems"
:key="key"
>
<a class="dropdown-item" :href="item.link" target="_blank">
{{ $p.t(item.description) }}
</a>
</li>
</ul>
</li>
</app-menu>
<app-menu app-identifier="stv" />
</div>
</aside>
<nav id="sidebarMenu" class="bg-light offcanvas offcanvas-start col-md p-md-0 h-100">
<div class="offcanvas-header justify-content-end px-1 d-md-none">
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" :aria-label="$p.t('ui/schliessen')"></button>
</div>
<stv-verband :preselectedKey="studiengangKz ? '' + studiengangKz : null" :endpoint="verbandEndpoint" @select-verband="onSelectVerband" class="col" style="height:0%"></stv-verband>
<stv-verband :preselectedKey="'' + studiengangKz" :endpoint="verbandEndpoint" @select-verband="onSelectVerband" class="col" style="height:0%"></stv-verband>
<stv-studiensemester v-model:studiensemester-kurzbz="studiensemesterKurzbz" @update:studiensemester-kurzbz="studiensemesterChanged"></stv-studiensemester>
</nav>
<main class="col-md-8 ms-sm-auto col-lg-9 col-xl-10">
@@ -629,6 +411,5 @@ export default {
</main>
</div>
</div>
<app-config ref="config" v-model="appconfig" :endpoints="configEndpoints"></app-config>
</div>`
};
@@ -41,34 +41,25 @@ export default {
return Object.fromEntries(Object.entries(this.configStudents).filter(([ , value ]) => !value.showOnlyWithUid && !value.showOnlyWithUid));
}
},
watch: {
'$p.user_language.value'(n, o) {
if (n !== o && o !== undefined)
this.loadConfig();
}
},
methods: {
loadConfig() {
this.$api
.call(ApiStvApp.configStudent())
.then(result => {
this.configStudent = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
this.$api
.call(ApiStvApp.configStudents())
.then(result => {
this.configStudents = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
reload() {
if (this.$refs.tabs?.$refs?.current?.reload)
this.$refs.tabs.$refs.current.reload();
}
},
created() {
this.loadConfig();
this.$api
.call(ApiStvApp.configStudent())
.then(result => {
this.configStudent = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
this.$api
.call(ApiStvApp.configStudents())
.then(result => {
this.configStudents = result.data;
})
.catch(this.$fhcAlert.handleSystemError);
},
template: `
<div class="stv-details h-100 d-flex flex-column">
@@ -163,12 +163,12 @@ export default {
frozen: true
},
],
layout: 'fitDataStretchFrozen',
layout: 'fitDataFill',
layoutColumnsOnNewData: false,
height: 'auto',
minHeight: '200',
index: 'abschlusspruefung_id',
persistenceID: 'stv-details-finalexam-2025112401'
persistenceID: 'stv-details-finalexam'
},
tabulatorEvents: [
{
@@ -107,10 +107,10 @@ export default {
frozen: true
},
],
layout: 'fitDataStretchFrozen',
layout: 'fitDataFill',
height: '500',
index: 'anrechnung_id',
persistenceID: 'stv-details-anrechnungen-2025112401'
persistenceID: 'stv-details-anrechnungen'
},
tabulatorEvents: [
{
@@ -120,12 +120,12 @@ export default {
frozen: true
}
],
layout: 'fitDataStretchFrozen',
layout: 'fitDataFill',
layoutColumnsOnNewData: false,
height: 'auto',
minHeight: 200,
index: 'aufnahmetermin_id',
persistenceID: 'stv-details-table_admission-dates-2025112401'
persistenceID: 'stv-details-table_admission-dates'
},
tabulatorEvents: [
{
@@ -322,7 +322,7 @@ export default {
this.$refs.filterButton.title = this.$p.t('admission', 'loadZukuenftigeRT');}
},
openAdministrationPlacementTest(reihungstest_id){
let link = FHC_JS_DATA_STORAGE_OBJECT.app_root + 'vilesci/stammdaten/reihungstestverwaltung.php';
let link = this.cisRoot + 'vilesci/stammdaten/reihungstestverwaltung.php';
if(reihungstest_id){
link += '?reihungstest_id=' + reihungstest_id;
}
@@ -1,83 +0,0 @@
export default {
name: "TabCombinePeople",
inject: {
cisRoot: {
from: 'cisRoot'
},
},
props: {
modelValue: Object,
},
data(){
return {
iframeUrl: null,
viewLoaded: false
}
},
computed: {
personIds() {
return Array.isArray(this.modelValue)
? this.modelValue.map(e => e.person_id)
: [this.modelValue.person_id];
},
detailStringPerson1(){
let person1 = this.modelValue[0];
return person1.vorname + " " + person1.nachname + "(" + person1.person_id + ")";
},
detailStringPerson2(){
let person2 = this.modelValue[1];
return person2.vorname + " " + person2.nachname + "(" + person2.person_id+ ")";
},
},
methods: {
combinePeople(){
this.viewLoaded = true;
let person1_id = this.personIds[0];
let person2_id = this.personIds[1];
if(person1_id == person2_id) {
return this.$fhcAlert.alertError(this.$p.t('stv', 'error_combinePeople_samePerson'));
}
let linkCombinePeople = this.cisRoot + 'vilesci/stammdaten/personen_wartung.php?person_id_1=' + person1_id + '&person_id_2='+ person2_id;
this.openLink(linkCombinePeople);
},
openLink(url) {
this.iframeUrl = url;
},
goBack(){
this.viewLoaded = false;
this.iframeUrl = null;
}
},
template: /*html*/ `
<div class="stv-details-combine-people h-100 pb-3">
<div v-if="!this.viewLoaded">
<h4>Personen zusammenlegen</h4>
<div v-if="this.modelValue.length">
<div v-if="this.modelValue.length == 2">
<p>{{$p.t('stv', 'question_combine_people', { person1: detailStringPerson1, person2: detailStringPerson2 })}}</p>
<button class="btn btn-primary" @click="combinePeople">{{$p.t('ui', 'ok')}}</button>
</div>
<div v-else>
ungültige Anzahl: {{this.modelValue.length}} <!-- should not be seen anymore-->
</div>
</div>
</div>
<div v-else>
<button class="btn btn-secondary" @click="goBack">{{$p.t('ui', 'cancel')}}</button>
</div>
<!-- Iframe-Section -->
<iframe
v-if="iframeUrl"
:src="iframeUrl"
class="w-100 mt-4 border-0"
style="height: 600px;"
></iframe>
</div>
`
};
@@ -186,7 +186,7 @@ export default {
<label>{{$p.t('global', 'zugangscode')}}</label>
<div class="align-self-center">
<span class="form-text">
<a :href="cisRoot + 'addons/bewerbung/cis/registration.php?code=' + data.zugangscode + '&emailAdresse=' + (data.email_privat == null ? data.email_privat_unverified : data.email_privat) + '&keepEmailUnverified=true'" target="_blank">{{data.zugangscode}}</a>
<a :href="cisRoot + 'addons/bewerbung/cis/registration.php?code=' + data.zugangscode + '&emailAdresse=' + data.email_privat + '&keepEmailUnverified=true'" target="_blank">{{data.zugangscode}}</a>
</span>
</div>
</div>
@@ -71,10 +71,10 @@ export default {
frozen: true
},
],
layout: 'fitDataStretchFrozen',
layout: 'fitColumns',
layoutColumnsOnNewData: false,
height: 200,
persistenceID: 'core-mobility-purpose-2025112401'
persistenceID: 'core-mobility-purpose'
},
tabulatorEvents: [
{
@@ -69,10 +69,10 @@ export default {
frozen: true
},
],
layout: 'fitDataStretchFrozen',
layout: 'fitColumns',
layoutColumnsOnNewData: false,
height: 200,
persistenceID: 'core-mobility-support-2025112401'
persistenceID: 'core-mobility-support'
},
tabulatorEvents: [
{
@@ -109,12 +109,12 @@ export default {
frozen: true
},
],
layout: 'fitDataStretchFrozen',
layout: 'fitDataFill',
layoutColumnsOnNewData: false,
height: 'auto',
minHeight: 200,
index: 'bisio_id',
persistenceID: 'stv-details-table_mobiliy-2025112401'
persistenceID: 'stv-details-table_mobiliy'
},
tabulatorEvents: [
{
@@ -217,13 +217,9 @@ export default {
},
columns,
height: '100%',
layout: 'fitDataStretchFrozen',
selectable: 1,
selectableRangeMode: 'click',
persistenceID: 'stv-details-noten-zeugnis-2025112401',
persistence:{
columns: ["width", "visible", "frozen"]
}
persistenceID: 'stv-details-noten-zeugnis'
};
}
},
@@ -291,4 +287,4 @@ export default {
<zeugnis-documents :data="grade" :list="config.documentslist"></zeugnis-documents>
</Teleport>
</div>`
};
};
@@ -227,15 +227,15 @@ export default{
const rowData = row.getData();
if (this.dataMeldestichtag && this.dataMeldestichtag > rowData.datum)
{
row.getElement().classList.add('text-black','text-opacity-50','fst-italic');
row.getElement().classList.add('disabled');
}
},
layout: 'fitDataStretchFrozen',
layout: 'fitDataFill',
layoutColumnsOnNewData: false,
height: 'auto',
selectable: false,
index: 'statusId',
persistenceID: 'stv-multistatus-2025112401'
persistenceID: 'stv-multistatus'
},
tabulatorEvents: [
{
@@ -40,9 +40,6 @@ export default {
}
return lehreinheiten;
},
firmenverwaltungLink(){
return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'vilesci/stammdaten/firma_frameset.html';
}
},
props: {
@@ -258,25 +255,18 @@ export default {
<div class="row mb-3">
<div class="col-10">
<form-input
container-class="stv-details-projektarbeit-firma"
:label="$p.t('projektarbeit', 'firma')"
type="autocomplete"
optionLabel="name"
v-model="formData.firma"
name="firma"
:suggestions="filteredFirmen"
@complete="searchFirma"
:min-length="3"
>
</form-input>
</div>
<div class="col-2 align-content-center">
<a :href="firmenverwaltungLink" target="_blank">
{{ $p.t('projektarbeit', 'zurFirmenverwaltung') }}
</a>
</div>
<form-input
container-class="stv-details-projektarbeit-firma"
:label="$p.t('projektarbeit', 'firma')"
type="autocomplete"
optionLabel="name"
v-model="formData.firma"
name="firma"
:suggestions="filteredFirmen"
@complete="searchFirma"
:min-length="3"
>
</form-input>
</div>
<div class="row mb-3">
@@ -240,7 +240,7 @@ export default {
frozen: true
},
],
layout: 'fitDataStretchFrozen',
//layout: 'fitDataFill',
height: 'auto',
minHeight: '200',
selectable: 1,
@@ -248,7 +248,7 @@ export default {
persistence:{
columns: true, //persist column layout
},
persistenceID: 'stv-details-projektarbeit-2025112401'
persistenceID: 'stv-details-projektarbeit'
}
return options;
}
@@ -396,8 +396,8 @@ export default {
<template #footer>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{$p.t('ui', 'abbrechen')}}</button>
<button v-if="statusNew" class="btn btn-primary" @click="addNewProjektarbeit()"> {{$p.t('ui', 'speichern')}}</button>
<button v-if="!statusNew && activeTab == 'details'" class="btn btn-primary" @click="updateProjektarbeit()"> {{$p.t('ui', 'speichern')}}</button>
<button v-if="statusNew" class="btn btn-primary" @click="addNewProjektarbeit()"> {{$p.t('ui', 'speichern')}}</button>
<button v-if="!statusNew && activeTab == 'details'" class="btn btn-primary" @click="updateProjektarbeit()"> {{$p.t('ui', 'speichern')}}</button>
</template>
</bs-modal>
@@ -115,7 +115,7 @@ export default {
frozen: true
},
],
layout: 'fitDataStretchFrozen',
//layout: 'fitDataFill',
layoutColumnsOnNewData: false,
height: 'auto',
minHeight: '100',
@@ -125,7 +125,7 @@ export default {
persistence:{
columns: true, //persist column layout
},
persistenceID: 'stv-details-projektbetreuer-2025112401'
persistenceID: 'stv-details-projektbetreuer'
},
tabulatorEvents: [
{
@@ -46,6 +46,8 @@ export default{
{title: "Punkte", field: "punkte", visible: false},
{
title: 'Aktionen', field: 'actions',
minWidth: 150,
maxWidth: 150,
formatter: (cell, formatterParams, onRendered) => {
let container = document.createElement('div');
container.className = "d-flex gap-2";
@@ -91,7 +93,7 @@ export default{
layoutColumnsOnNewData: false,
height: 'auto',
index: 'pruefung_id',
persistenceID: 'stv-details-pruefung-list-2025112402'
persistenceID: 'stv-details-pruefung-list'
},
tabulatorEvents: [
{
@@ -146,6 +148,7 @@ export default{
listMas: [],
listMarks: [],
zeugnisData: [],
checkData:[],
filter: false,
statusNew: true,
isStartDropDown: false,
@@ -178,7 +181,7 @@ export default{
this.pruefungData.student_uid = this.uid;
this.pruefungData.note = 9;
this.pruefungData.datum = luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate();
this.pruefungData.datum = new Date();
this.pruefungData.pruefungstyp_kurzbz = null;
if(lv_id){
this.pruefungData.lehrveranstaltung_id = lv_id;
@@ -190,7 +193,7 @@ export default{
this.isStartDropDown = false;
this.loadPruefung(pruefung_id).then(() => {
this.pruefungData.note = 9;
this.pruefungData.datum = luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate();
this.pruefungData.datum = new Date();
this.pruefungData.pruefungstyp_kurzbz = null;
this.pruefungData.anmerkung = null;
this.prepareDropdowns();
@@ -226,8 +229,9 @@ export default{
return this.$refs.examData
.call(ApiStvExam.addPruefung(this.pruefungData))
.then(response => {
if (response.data)
this.$fhcAlert.alertDefault('info', 'Info', response.data, true);
this.checkData = response.data;
if (this.checkData === 2 || this.checkData === 5)
this.$fhcAlert.alertInfo(this.$p.t('exam', 'hinweis_changeAfterExamDate'));
else
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
this.hideModal('pruefungModal');
@@ -239,13 +243,12 @@ export default{
});
},
updatePruefung(pruefung_id){
this.checkChangeAfterExamDate();
return this.$refs.examData
.call(ApiStvExam.updatePruefung(pruefung_id, this.pruefungData))
.then(response => {
if (response.data)
this.$fhcAlert.alertDefault('info', 'Info', response.data, true);
else
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
this.checkData = response.data;
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
this.hideModal('pruefungModal');
this.resetModal();
}).catch(this.$fhcAlert.handleSystemError)
@@ -263,6 +266,27 @@ export default{
else
this.showHint = false;
},
checkChangeAfterExamDate() {
const data = {
student_uid: this.pruefungData.student_uid,
studiensemester_kurzbz: this.pruefungData.studiensemester_kurzbz,
lehrveranstaltung_id: this.pruefungData.lehrveranstaltung_id
};
return this.$api
.call(ApiStvExam.checkZeugnisnoteLv(data))
.then(result => {
this.zeugnisData = result.data;
let checkDate = this.zeugnisData[0].uebernahmedatum === '' ||
this.zeugnisData[0].benotungsdatum > this.zeugnisData[0].uebernahmedatum
? this.zeugnisData[0].benotungsdatum
: this.zeugnisData[0].uebernahmedatum;
if (checkDate >= this.pruefungData.datum
&& this.pruefungData.note !== this.zeugnisData[0].note) {
this.$fhcAlert.alertInfo(this.$p.t('exam', 'hinweis_changeAfterExamDate'));
}
})
.catch(this.$fhcAlert.handleSystemError);
},
deletePruefung(pruefung_id) {
return this.$api
.call(ApiStvExam.deletePruefung(pruefung_id))
@@ -510,7 +534,6 @@ export default{
container-class="mb-3"
type="DatePicker"
v-model="pruefungData.datum"
model-type="yyyy-MM-dd"
name="datum"
:label="$p.t('global/datum')"
auto-apply
@@ -2,8 +2,6 @@ import {CoreFilterCmpt} from "../../filter/Filter.js";
import ListNew from './List/New.js';
import ListFilter from './List/Filter.js';
import { capitalize } from '../../../helpers/StringHelpers.js';
import draggable from '../../../directives/draggable.js';
export default {
@@ -135,17 +133,7 @@ export default {
{
return Promise.resolve({ data: []});
}
/**
* NOTE(chris): Because of a bug in Tabulator
* we need to get the params from elsewhere.
* @see https://github.com/olifolkerd/tabulator/issues/4318
*/
const apiconfig = {
...this.tabulatorOptions.ajaxConfig,
url: this.tabulatorOptions.ajaxURL,
params: this.tabulatorOptions.ajaxParams
};
return this.$api.call(apiconfig);
return this.$api.call({method: 'post', url, params});
},
ajaxResponse: (url, params, response) => {
return response?.data;
@@ -187,7 +175,7 @@ export default {
count: 0,
filteredcount: 0,
selectedcount: 0,
currentEndpoint: null
currentEndpointRawUrl: ''
}
},
computed: {
@@ -240,84 +228,7 @@ export default {
return "StudentList_" + today + ".csv";
}
},
watch: {
'$p.user_language.value'(n, o) {
if (n !== o && o !== undefined && this.$refs.table.tableBuilt) {
this.translateTabulator();
}
}
},
methods: {
translateTabulator() {
this.$p
.loadCategory(['global', 'person', 'lehre', 'ui', 'profilUpdate', 'admission', 'stv'])
.then(() => {
const translations = {
uid: capitalize(this.$p.t('person/uid')),
titelpre: capitalize(this.$p.t('person/titelpre')),
nachname: capitalize(this.$p.t('person/nachname')),
vorname: capitalize(this.$p.t('person/vorname')),
wahlname: capitalize(this.$p.t('person/wahlname')),
vornamen: capitalize(this.$p.t('person/vornamen')),
titelpost: capitalize(this.$p.t('person/titelpost')),
ersatzkennzeichen: capitalize(this.$p.t('person/ersatzkennzeichen')),
gebdatum: capitalize(this.$p.t('person/geburtsdatum')),
geschlecht: capitalize(this.$p.t('person/geschlecht')),
semester: capitalize(this.$p.t('lehre/sem')),
verband: capitalize(this.$p.t('lehre/verb')),
gruppe: capitalize(this.$p.t('lehre/grp')),
studiengang: capitalize(this.$p.t('lehre/studiengang')),
studiengang_kz: capitalize(this.$p.t('lehre/studiengang_kz')),
matrikelnr: capitalize(this.$p.t('person/personenkennzeichen')),
person_id: capitalize(this.$p.t('person/person_id')),
status: capitalize(this.$p.t('global/status')),
status_datum: capitalize(this.$p.t('profilUpdate/statusDate')),
status_bestaetigung: capitalize(this.$p.t('global/status_bestaetigung')),
mail_privat: capitalize(this.$p.t('person/email_private')),
mail_intern: capitalize(this.$p.t('person/email_intern')),
anmerkungen: capitalize(this.$p.t('stv/notes_person')),
anmerkung: capitalize(this.$p.t('stv/notes_prestudent')),
orgform_kurzbz: capitalize(this.$p.t('lehre/orgform')),
aufmerksamdurch_kurzbz: capitalize(this.$p.t('person/aufmerksamDurch')),
punkte: capitalize(this.$p.t('admission/gesamtpunkte')),
aufnahmegruppe_kurzbz: capitalize(this.$p.t('stv/aufnahmegruppe_kurzbz')),
dual: capitalize(this.$p.t('lehre/dual_short')),
matr_nr: capitalize(this.$p.t('person/matrikelnummer')),
studienplan_bezeichnung: capitalize(this.$p.t('lehre/studienplan')),
prestudent_id: capitalize(this.$p.t('ui/prestudent_id')),
priorisierung_relativ: capitalize(this.$p.t('lehre/prioritaet')),
mentor: capitalize(this.$p.t('stv/mentor')),
bnaktiv: capitalize(this.$p.t('person/aktiv'))
};
/** NOTE(chris):
* use this approach because updateDefinition
* on the Tabulator columns is way slower and
* freezes up the GUI.
*/
// Overwrite definition for column show/hide
this.$refs.table.tabulator.getColumns().forEach(col => {
const trans = translations[col.getField()];
if (!trans)
return;
col.getDefinition().title = trans;
});
// Overwrite node in dom
this.$refs.table.tabulator.element
.querySelectorAll('.tabulator-col[tabulator-field]')
.forEach(el => {
const field = el.getAttribute('tabulator-field');
if (!translations[field])
return;
const title = el.querySelector('.tabulator-col-title');
if (!title)
return;
title.innerText = translations[field];
});
});
},
reload() {
this.$refs.table.reloadTable();
},
@@ -362,20 +273,16 @@ export default {
updateUrl(endpoint, first) {
this.lastSelected = first ? undefined : this.selected;
console.log('function param endpoint: ' + JSON.stringify(endpoint));
console.log('current endpoint: ' + JSON.stringify(this.currentEndpoint));
if( endpoint === undefined && this.currentEndpoint === null)
if( endpoint === undefined )
{
endpoint = { url: '' };
}
else if( endpoint === undefined )
endpoint = {url: this.currentEndpointRawUrl};
}
else if( endpoint.url === undefined )
{
endpoint = JSON.parse(JSON.stringify(this.currentEndpoint));
}
else
endpoint.url = this.currentEndpointRawUrl;
} else
{
this.currentEndpoint = JSON.parse(JSON.stringify(endpoint));
this.currentEndpointRawUrl = endpoint.url;
}
endpoint.url = endpoint.url.replace(
@@ -383,25 +290,20 @@ export default {
encodeURIComponent(this.currentSemester)
);
const params = (endpoint?.params !== undefined) ? endpoint.params : {};
let method = (endpoint?.method !== undefined) ? endpoint.method : 'get';
if (this.filter.length && !endpoint.url.match(/\/search\//))
{
const params = {};
if (this.filter.length)
params.filter = this.filter;
method = 'post';
}
this.tabulatorOptions.ajaxURL = endpoint.url;
this.tabulatorOptions.ajaxParams = { ...params };
this.tabulatorOptions.ajaxConfig = {method};
if (!this.$refs.table.tableBuilt) {
if (this.$refs.table.tabulator) {
if (!this.$refs.table.tabulator) {
this.tabulatorOptions.ajaxURL = endpoint.url;
this.tabulatorOptions.ajaxParams = params;
} else
this.$refs.table.tabulator.on("tableBuilt", () => {
this.$refs.table.tabulator.setData(endpoint.url, params, method);
this.$refs.table.tabulator.setData(endpoint.url, params);
});
}
} else
this.$refs.table.tabulator.setData(endpoint.url, params, method);
this.$refs.table.tabulator.setData(endpoint.url, params);
},
dragCleanup(evt) {
if (evt.dataTransfer.dropEffect == 'none')
@@ -500,7 +402,6 @@ export default {
*/`
:new-btn-label="$p.t('stv/action_new')"
@click:new="actionNewPrestudent"
@table-built="translateTabulator"
>
<template #filter>
<div class="card">
@@ -16,17 +16,11 @@ export default {
inject: {
$reloadList: {
from: '$reloadList',
default: () => {}
required: true
},
currentSemester: {
from: 'currentSemester',
required: true
},
appConfig: {
from: 'appConfig',
default: {
number_displayed_past_studiensemester: 5
}
}
},
emits: [
@@ -58,9 +52,6 @@ export default {
return this.nodes.filter(node => this.favorites.list.includes(node.key));
return this.nodes;
},
noSemReloadNodes() {
return this.nodes.reduce(this.mapNodesToNoSemReloadNodes, []);
}
},
watch: {
@@ -68,14 +59,6 @@ export default {
if (newVal !== oldVal) {
this.setPreselection();
}
},
'appConfig.number_displayed_past_studiensemester'(newVal, oldVal) {
if (oldVal !== undefined) {
this.noSemReloadNodes.forEach(node => {
delete node.children;
this.onExpandTreeNode(node);
});
}
}
},
methods: {
@@ -131,14 +114,7 @@ export default {
},
onSelectTreeNode(node) {
if (node.data.link)
this.$emit('selectVerband', {link: node.data.link, studiengang_kz: node.data.stg_kz, semester: node.data.semester, orgform_kurzbz: node.data.orgform_kurzbz});
},
mapNodesToNoSemReloadNodes(result, node) {
if (node.data.no_sem_reload)
result.push(node);
if (node.children)
result = node.children.reduce(this.mapNodesToNoSemReloadNodes, result);
return result;
this.$emit('selectVerband', {link: node.data.link, studiengang_kz: node.data.stg_kz});
},
mapResultToTreeData(el) {
const cp = {
@@ -194,10 +170,7 @@ export default {
async setPreselection()
{
if (!this.preselectedKey)
{
this.selectedKey = null;
return;
}
let rawKey = this.preselectedKey
@@ -211,25 +184,22 @@ export default {
if (!currentNode)
return;
if(this.selectedKey)
{
const currentSelectedKey = Object.keys(this.selectedKey).find(Boolean);
if (currentSelectedKey) {
if (currentSelectedKey == currentKey)
return;
/**
* Do not select a new entry if the current is a child of the new one.
* This happens if a child entry of a new stg is selected and the router
* tries to select the stg root entry (because subtrees do not have
* routes yet)
*/
const isChild = this.findNodeByKey(
currentSelectedKey,
currentNode.children || []
);
if (isChild)
return;
}
const currentSelectedKey = Object.keys(this.selectedKey).find(Boolean);
if (currentSelectedKey) {
if (currentSelectedKey == currentKey)
return;
/**
* Do not select a new entry if the current is a child of the new one.
* This happens if a child entry of a new stg is selected and the router
* tries to select the stg root entry (because subtrees do not have
* routes yet)
*/
const isChild = this.findNodeByKey(
currentSelectedKey,
currentNode.children
);
if (isChild)
return;
}
for (let i = 1; i < parts.length; i++)
+3 -59
View File
@@ -33,8 +33,7 @@ export default {
data() {
return {
current: null,
tabs: {},
count: null
tabs: {}
}
},
computed: {
@@ -114,12 +113,10 @@ export default {
};
}
if (Array.isArray(config)) {
if (Array.isArray(config))
config.forEach((item, key) => _addToTabs(key, item));
}
else {
else
Object.entries(config).forEach(([key, item]) => _addToTabs(key, item));
}
if (this.current === null || !tabs[this.current]) {
if (tabs[this.default])
@@ -132,57 +129,6 @@ export default {
updateSuffix() {
this.getTabSuffix(this.currentTab);
},
removeInvalidCountTabs(){
if(this.modelValue.length)
{
let countIst = this.modelValue.length;
const tabsToDelete = [];
Object.entries(this.config).forEach(([key, item]) => {
const target = item?.config ? item : item?.value || item;
// check config for validCountMulti
if (target.config?.validCountMulti !== undefined) {
let tab;
let countSoll;
tab = key;
countSoll = target.config.validCountMulti;
//check if tab is existing
if (countSoll !== undefined && countSoll == countIst) {
//add tab if it was removed before
if (tab in this.tabs == false) {
const value = Vue.reactive({
suffix: '',
showSuffix: item.showSuffix || false
});
this.tabs[tab] = {
component: Vue.markRaw(Vue.defineAsyncComponent(() => import(item.component))),
title: Vue.computed(() => item.title || tab),
config: item.config,
tab,
value,
suffixhelper: item.suffixhelper ?? null
};
}
}
//add to toDeleteArray if count is not allowed
if (countSoll !== undefined && countSoll !== countIst) {
tabsToDelete.push(tab);
}
}
});
// Delete all tabs with count not allowed
tabsToDelete.forEach(k => {
delete this.tabs[k];
});
}
},
async getTabSuffix(tab) {
if (!tab.value.showSuffix) {
return;
@@ -205,11 +151,9 @@ export default {
},
mounted() {
this.getTabSuffixes();
this.removeInvalidCountTabs();
},
updated() {
this.getTabSuffixes();
this.removeInvalidCountTabs();
},
template: `
<template v-if="useprimevue">
-12
View File
@@ -200,9 +200,6 @@ export default {
minute: "2-digit",
second: "2-digit"
});
},
async copy (){
await navigator.clipboard.writeText(this.tagData.notiz);
}
},
template: `
@@ -239,15 +236,6 @@ export default {
:readonly="tagData.readonly"
placeholder="Notiz..."
></form-input>
<button
type="button"
class="btn btn-outline-secondary btn-sm copy-btn"
@click="copy"
v-if="mode === 'edit'"
:disabled="!tagData.notiz || tagData.notiz.trim() === ''"
>
<i class="fa-solid fa-copy"></i>
</button>
<div class="modificationdate">
<span v-if="tagData.verfasser">
{{ $p.t('notiz', 'tag_verfasser', { 0: tagData.verfasser, 1: tagData.insertamum }) }}
@@ -1,62 +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 {
emits: [
'changed'
],
props: {
activeClass: {
type: String,
default: 'active'
},
itemClass: {
type: [String, Array, Object],
default: ''
}
},
data() {
return {
languages: FHC_JS_DATA_STORAGE_OBJECT.server_languages
};
},
methods:{
onChange(lang) {
if (this.languages.some(l => l.sprache === lang)) {
this.$p
.setLanguage(lang)
.then(() => {
if (document.querySelector('[cis4Reload]'))
window.location.reload();
else
this.$emit('changed', lang);
});
}
}
},
template: /*html*/`
<div class="navigation-language d-flex justify-content-center align-items-center flex-nowrap overflow-hidden">
<button
v-for="lang in languages"
:class="[itemClass, {[activeClass]: $p.user_language.value == lang.sprache}]"
:selected="$p.user_language.value == lang.sprache"
@click.prevent="onChange(lang.sprache)"
>
{{ lang.bezeichnung }}
</button>
</div>`
};
+14 -43
View File
@@ -23,17 +23,7 @@ export default {
mergedStudent,
mergedPerson
},
props: {
searchoptions: {
type: Object,
required: true
},
searchfunction: {
type: Function,
required: true
},
showBtnSubmit: Boolean
},
props: [ "searchoptions", "searchfunction" ],
provide() {
return {
query: Vue.computed(() => this.lastQuery)
@@ -112,22 +102,11 @@ export default {
>
<button
v-if="searchsettings.searchstr"
type="button"
class="searchbar_input_clear btn btn-outline-secondary"
@click="clearInput"
@focusin.stop
>
<i class="fas fa-close"></i>
</button>
<button
v-if="showBtnSubmit"
type="submit"
class="btn btn-primary"
:title="$p.t('search/submit')"
:aria-label="$p.t('search/submit')"
>
<i class="fas fa-search"></i>
</button>
<button
data-bs-toggle="collapse"
data-bs-target="#searchSettings"
@@ -240,12 +219,12 @@ export default {
});
}
},
methods: {
clearInput() {
this.searchsettings.searchstr = "";
this.hideresult();
this.$refs.input.focus();
},
methods: {
clearInput() {
this.searchsettings.searchstr = "";
this.hideresult();
this.$refs.input.focus()
},
getInitiallySelectedTypes() {
let result = false;
if (this.searchoptions.origin) {
@@ -304,9 +283,13 @@ export default {
this.calcSearchResultHeight();
},
search: function() {
if(this.searchoptions?.nolivesearch === true) return;
this.abort();
if( this.searchtimer !== null ) {
clearTimeout(this.searchtimer);
}
if (this.abortController) {
this.abortController.abort();
this.abortController = null;
}
if( this.searchsettings.searchstr.length >= 2 ) {
this.calcSearchResultExtent();
this.searchtimer = setTimeout(
@@ -317,16 +300,6 @@ export default {
this.showresult = false;
}
},
abort() {
if (this.searchtimer !== null) {
clearTimeout(this.searchtimer);
}
if (this.abortController) {
this.abortController.abort();
this.abortController = null;
}
this.searchresult = [];
},
callsearchapi: function() {
this.error = null;
this.searchresult.splice(0, this.searchresult.length);
@@ -419,8 +392,6 @@ export default {
window.removeEventListener('resize', this.calcSearchResultExtent);
},
showsearchresult: function() {
if(this.searchoptions?.nolivesearch === true) return;
if( this.searchsettings.searchstr.length >= 2 ) {
this.showresult = true;
window.addEventListener('resize', this.calcSearchResultExtent);
-62
View File
@@ -1,62 +0,0 @@
/**
* v-tooltip - This directive makes it easy to initialize Bootstrap tooltips in Vue.
*
* Features:
* - Automatically initializes a Bootstrap tooltip on mount.
* - Re-initializes only when the bound value changes.
* - Cleans up the tooltip on unmount.
* Usage examples:
*
* 1) Shortest way:
* <span v-tooltip title="Static tooltip">
* Hover me!
* </span>
*
* 2) With binding value. New value will trigger update features (destroy old + create new tooltip creation)
* <span v-tooltip="userInfo" :title="userInfo">
* Hover me!
* </span>
*
* 3) Allowing HTML inside tooltip:
* <span v-tooltip title="<b>Bold text</b>" data-bs-html="true">
* Hover me!
* </span>
*
*/
export default {
mounted(el, binding) {
const opts = {
title: binding.value ?? el.getAttribute('title'), // fallback if no binding
html: el.getAttribute('data-bs-html') === 'true',
customClass: el.getAttribute('data-bs-custom-class') || ''
};
// Create tooltip
el._tooltip = new bootstrap.Tooltip(el, opts);
},
updated(el, binding) {
// Only dispose and create new Tooltip if value (the title-string) has changed
if (binding.value !== binding.oldValue){
if (el._tooltip) {
el._tooltip.dispose();
}
const opts = {
title: binding.value ?? el.getAttribute('title'), // fallback if no binding
html: el.getAttribute('data-bs-html') === 'true',
customClass: el.getAttribute('data-bs-custom-class') || ''
};
el._tooltip = new bootstrap.Tooltip(el, opts);
}
},
unmounted(el) {
// Cleanup
if (el._tooltip) {
el._tooltip.dispose();
delete el._tooltip;
}
}
}
+3 -23
View File
@@ -279,32 +279,12 @@ function draw_content($row)
$status='';
$mail_privat = '';
$mail_unverifiziert = '';
$qry_mail = "
SELECT
DISTINCT ON (kontakttyp) kontakt, kontakttyp
FROM
public.tbl_kontakt
WHERE
zustellung=TRUE
AND kontakttyp IN ('email', 'email_unverifiziert')
AND person_id = ".$db->db_add_param($row->person_id)."
ORDER BY
kontakttyp, kontakt_id DESC";
$qry_mail = "SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=".$db->db_add_param($row->person_id)." AND zustellung=true ORDER BY kontakt_id DESC LIMIT 1";
if($db->db_query($qry_mail))
{
if($row_mail = $db->db_fetch_object())
{
if ($row_mail->kontakttyp == 'email')
{
$mail_privat = $row_mail->kontakt;
}
elseif ($row_mail->kontakttyp == 'email_unverifiziert')
{
$mail_unverifiziert = $row_mail->kontakt;
}
$mail_privat = $row_mail->kontakt;
}
}
@@ -386,7 +366,7 @@ function draw_content($row)
<STUDENT:mail_privat><![CDATA['.$mail_privat.']]></STUDENT:mail_privat>
<STUDENT:mail_intern><![CDATA['.(isset($row->uid)?$row->uid.'@'.DOMAIN:'').']]></STUDENT:mail_intern>
<STUDENT:zugangscode><![CDATA['.$row->zugangscode.']]></STUDENT:zugangscode>
<STUDENT:link_bewerbungstool><![CDATA['.CIS_ROOT.'addons/bewerbung/cis/registration.php?code='.$row->zugangscode.'&emailAdresse='.($mail_privat == '' ? $mail_unverifiziert : $mail_privat).'&keepEmailUnverified=true]]></STUDENT:link_bewerbungstool>
<STUDENT:link_bewerbungstool><![CDATA['.CIS_ROOT.'addons/bewerbung/cis/registration.php?code='.$row->zugangscode.'&emailAdresse='.$mail_privat.'&keepEmailUnverified=true]]></STUDENT:link_bewerbungstool>
<STUDENT:bpk><![CDATA['.$row->bpk.']]></STUDENT:bpk>
<STUDENT:aktiv><![CDATA['.$aktiv.']]></STUDENT:aktiv>
-1
View File
@@ -85,7 +85,6 @@ require_once('dbupdate_3.4/66982_berufsschule.php');
require_once('dbupdate_3.4/40314_electronic_onboarding_anbindung_ida.php');
require_once('dbupdate_3.4/47972_pruefungsverwaltung_ects_angabe.php');
require_once('dbupdate_3.4/67490_studstatus_suche_abort_controller_haengt.php');
require_once('dbupdate_3.4/68744_StV_settings.php');
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
@@ -1,16 +0,0 @@
<?php
if (!defined('DB_NAME')) exit('No direct script access allowed');
// Add new name type in public.tbl_variablenname
if ($result = @$db->db_query("SELECT 1 FROM public.tbl_variablenname WHERE name = 'stv_font_size';"))
{
if ($db->db_num_rows($result) == 0)
{
$qry = "INSERT INTO public.tbl_variablenname(name, defaultwert) VALUES('stv_font_size', null);";
if (!$db->db_query($qry))
echo '<strong>public.tbl_variablenname '.$db->db_last_error().'</strong><br>';
else
echo 'public.tbl_variablenname: Added name "stv_font_size"<br>';
}
}
-23
View File
@@ -529,29 +529,6 @@ $filters = array(
',
'oe_kurzbz' => null,
),
array(
'app' => 'infocenter',
'dataset_name' => 'onboarding',
'filter_kurzbz' => 'InfoCenterOnboarding',
'description' => '{Alle}',
'sort' => 1,
'default_filter' => true,
'filter' => '
{
"name": "Electronic Onboarding - Alle",
"columns": [
{"name": "PersonId"},
{"name": "Vorname"},
{"name": "Nachname"},
{"name": "LockUser"},
{"name": "HoldDate"},
{"name": "Rueckstellgrund"}
],
"filters": []
}
',
'oe_kurzbz' => null,
),
array(
'app' => 'infocenter',
'dataset_name' => 'aufgenommen',
+3
View File
@@ -0,0 +1,3 @@
<?php
phpinfo();
?>
-862
View File
@@ -1795,66 +1795,6 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'logout',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Logout',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Logout',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'settings',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Einstellungen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Settings',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
'phrase' => 'settings_saved',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Einstellungen gespeichert',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Settings saved',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'ui',
@@ -2602,46 +2542,6 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'person',
'phrase' => 'email_private',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'EMail (Privat)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'email (private)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'person',
'phrase' => 'email_intern',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'EMail (Intern)',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'email (intern)',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'person',
@@ -3224,26 +3124,6 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'orgform',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'OrgForm',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'orgform',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
@@ -3284,26 +3164,6 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'grp',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Grp.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'grp.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
@@ -3644,26 +3504,6 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'sem',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Sem.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'sem.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
@@ -3704,166 +3544,6 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'bereitzugeteilt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Lektor bereits zugewiesen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Lektor already assigned',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'grpbereitszugeteilt',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Gruppe bereits zugewiesen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Group already assigned',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'grpbereitsverplant',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Gruppe ist bereits verplant',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Group is already scheduled',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'lektorbereitsverplant',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Wechsel vom Mitarbeiter nicht möglich da er bereits verplant ist.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Changing the employee is not possible because they are already scheduled.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'keinvertrag',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Noch kein Vertrag',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No contract yet',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'pep',
'category' => 'ui',
'phrase' => 'readonlycategory',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die Kategorie ist deaktiviert und kann nur im Lesemodus angezeigt werden.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'The category is deactivated and can only be viewed in read-only mode.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'pep',
'category' => 'ui',
'phrase' => 'werksvertragsects',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Werkvertragsvolumen in ECTS',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Work contract volume in ECTS',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'pep',
'category' => 'ui',
'phrase' => 'lv_entwicklung_rolle',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Rolle',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Role',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
@@ -3946,66 +3626,6 @@ $phrases = array(
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'studiengang_kz',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Studiengang KZ',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Study program no',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'verb',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Verb.',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'assoc.',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'dual_short',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Dual',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'dual',
'description' => '',
'insertvon' => 'system'
)
)
),
//********************** INFOCENTER/infocenter
array(
'app' => 'infocenter',
@@ -6641,26 +6261,6 @@ The invoice will be sent to you again. <u><strong>The amount is only to be trans
)
)
),
array(
'app' => 'core',
'category' => 'global',
'phrase' => 'status_bestaetigung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Status Bestätigung',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Status confirmation',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'global',
@@ -38920,166 +38520,6 @@ array(
)
),
//**************************** CORE/stv
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'settings_no_displayed_past_sem',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anzahl angezeigter vergangener Studiensemester',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Number of past semesters of study displayed',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'settings_fontsize',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Zoom',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Zoom',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'settings_fontsize_xx-small',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Sehr Klein',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Very Small',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'settings_fontsize_x-small',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Kleiner',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Smaller',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'settings_fontsize_small',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Klein',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Small',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'settings_fontsize_normal',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Normal',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Normal',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'settings_fontsize_big',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Groß',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Big',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'settings_fontsize_huge',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Sehr groß',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Very big',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
@@ -39100,86 +38540,6 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'notes_person',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anmerkungen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'notes',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'notes_prestudent',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Anmerkung Pre',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'note Pre',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'aufnahmegruppe_kurzbz',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Aufnahmegruppe',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'admission group',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'mentor',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Mentor',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'mentor',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
@@ -39360,86 +38720,6 @@ array(
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'grade_report',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Notenspiegel',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Grade report',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'grade_report_xls',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Notenspiegel EXCEL',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Grade report EXCEL',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'grade_report_xls_extended',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Notenspiegel erweitert EXCEL',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Grade report extended EXCEL',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'grade_report_html',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Notenspiegel HTML',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Grade report HTML',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
@@ -46927,46 +46207,6 @@ and represent the current state of research on the topic. The prescribed citatio
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'aufklappen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Aufklappen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Expand',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
'phrase' => 'zuklappen',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Zuklappen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Collapse',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'lehre',
@@ -49771,26 +49011,6 @@ and represent the current state of research on the topic. The prescribed citatio
// FHC-4 Finetuning END
//**************************** CORE/search
array(
'app' => 'core',
'category' => 'search',
'phrase' => 'submit',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'suchen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'search',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'search',
@@ -52225,26 +51445,6 @@ I have been informed that I am under no obligation to consent to the transmissio
)
)
),
array(
'app' => 'core',
'category' => 'projektarbeit',
'phrase' => 'zurFirmenverwaltung',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Zur Firmenverwaltung',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Company management',
'description' => '',
'insertvon' => 'system'
)
)
),
// FHC-4 Projektarbeiten & Vertraege ENDE
// ### DOKUMENTE ERSTELLEN PHRASEN START ###
array(
@@ -52268,68 +51468,6 @@ I have been informed that I am under no obligation to consent to the transmissio
)
),
// ### DOKUMENTE ERSTELLEN PHRASEN END ###
// ### Personen zusammenlegen Phrasen BEGIN
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'tab_combine_people',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Personen zusammenlegen',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Combine People',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'question_combine_people',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Die Personen {person1} und {person2} zusammenlegen?',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'Merge the persons {person1} and {person2}?',
'description' => '',
'insertvon' => 'system'
)
)
),
array(
'app' => 'core',
'category' => 'stv',
'phrase' => 'error_combinePeople_samePerson',
'insertvon' => 'system',
'phrases' => array(
array(
'sprache' => 'German',
'text' => 'Keine Zusammenlegung möglich bei identischer Person ID!',
'description' => '',
'insertvon' => 'system'
),
array(
'sprache' => 'English',
'text' => 'No merging possible with identical person ID"',
'description' => '',
'insertvon' => 'system'
)
)
),
// ### Personen zusammenlegen Phrasen END
);
+3 -3
View File
@@ -71,7 +71,7 @@ $fileTmpName = null;
$fileMimeType = null;
// Constants
$L_CSV_N_COLS = 9; // Number of columns of the CSV file
$L_CSV_N_COLS = 10; // Number of columns of the CSV file
$L_ERROR = "Error";
$L_WARNING = "Warning";
$L_INFO = "Info";
@@ -477,8 +477,8 @@ if (!$errorOccurred && $dataPosted)
Feldtrenner: ;<br>
Texttrenner: "<br>
Felder:<br>
<pre>Nachname;Vorname;Gebdatum;UID/PersKZ;Studiengang;Betrag;IBAN;BIC;Bankname
Dylan;Bob;12.12.2000;1234567;MEE;750;ATXXXX;BBAWAATWW;BAWAG PSK</pre>
<pre>Nachname;Vorname;UID/PersKZ;Studiengang;Betrag;Überweisungsdatum
Dylan;Bob;1234567;MEE;750;03.10.2016</pre>
</td>
</tr>
<tr>