mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-23 09:52:22 +00:00
Compare commits
34 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 54168c86b4 | |||
| a8dd995195 | |||
| 1ae02d8ed8 | |||
| 7cda22f807 | |||
| 68292b60af | |||
| 6c25a3b262 | |||
| 1f6c9e865b | |||
| 1abfbccb3e | |||
| 362d1c8bb0 | |||
| 25a61a56b7 | |||
| afb210b0c2 | |||
| c84146fcbd | |||
| 35decf476c | |||
| 6cfc4b0973 | |||
| 6296b87ea5 | |||
| 576a44838f | |||
| c00e7a182c | |||
| fd1b5daf9c | |||
| c0b5f2f748 | |||
| b217681ee5 | |||
| 7841a73fc0 | |||
| 2064008f9e | |||
| 19b9906c86 | |||
| 2c3913a763 | |||
| 9111edf442 | |||
| b1c47da3c3 | |||
| 67eb238876 | |||
| a139cc8d2e | |||
| 35ecbdefa8 | |||
| be5aad7c33 | |||
| b7940a5cce | |||
| b662fa5fd3 | |||
| 21886e30a3 | |||
| df2f142f37 |
@@ -150,4 +150,6 @@ $config['stv_prestudent_tags'] = [
|
||||
'unterbrecher_auto' => ['readonly' => true],
|
||||
'stbtr_erh_auto' => ['readonly' => true],
|
||||
'jgv_auto' => ['readonly' => true],
|
||||
'in_auto' => ['readonly' => true],
|
||||
'preabbr_auto' => ['readonly' => true],
|
||||
];
|
||||
|
||||
@@ -259,7 +259,7 @@ class BetriebsmittelP extends FHCAPI_Controller
|
||||
$kaution = $this->input->post('kaution');
|
||||
if($kaution) $kaution = str_replace(',', '.', $kaution);
|
||||
$ausgegebenam = $this->input->post('ausgegebenam');
|
||||
$retouram = $this->input->post('retouram');
|
||||
$retouram = $this->input->post('retouram') == "" ? null : $this->input->post('retouram');
|
||||
|
||||
// NOTE(chris): transform_kartennummer
|
||||
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer)
|
||||
|
||||
@@ -9,10 +9,10 @@ class Detailheader extends FHCAPI_Controller
|
||||
public function __construct()
|
||||
{
|
||||
parent::__construct([
|
||||
'getHeader' => self::PERM_LOGGED,
|
||||
'getPersonAbteilung' => self::PERM_LOGGED,
|
||||
'getLeitungOrg' => self::PERM_LOGGED,
|
||||
'getSemesterStati' => self::PERM_LOGGED,
|
||||
'getHeader' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||
'getPersonAbteilung' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||
'getLeitungOrg' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r', 'admin:r', 'assistenz:r'],
|
||||
'getSemesterStati' => ['admin:r', 'assistenz:r'],
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@@ -294,6 +294,10 @@ class Funktionen extends FHCAPI_Controller
|
||||
{
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
if($datum_von == '')
|
||||
$datum_von = null;
|
||||
if($datum_bis == '')
|
||||
$datum_bis = null;
|
||||
|
||||
$result = $this->BenutzerfunktionModel->update(
|
||||
[
|
||||
|
||||
@@ -371,6 +371,9 @@ class Abschlusspruefung extends FHCAPI_Controller
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$datum = $formData['datum'] == '' ? null : $formData['datum'];
|
||||
$sponsion = $formData['sponsion'] == '' ? null : $formData['sponsion'];
|
||||
|
||||
$result = $this->AbschlusspruefungModel->update(
|
||||
[
|
||||
'abschlusspruefung_id' => $abschlusspruefung_id
|
||||
@@ -382,8 +385,8 @@ class Abschlusspruefung extends FHCAPI_Controller
|
||||
'vorsitz' => $vorsitz,
|
||||
'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'],
|
||||
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
|
||||
'datum' => $formData['datum'],
|
||||
'sponsion' => $formData['sponsion'],
|
||||
'datum' => $datum,
|
||||
'sponsion' => $sponsion,
|
||||
'pruefer1' => $pruefer1,
|
||||
'pruefer2' => $pruefer2,
|
||||
'pruefer3' => $pruefer3,
|
||||
|
||||
@@ -170,6 +170,8 @@ class Dokumente extends FHCAPI_Controller
|
||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||
}
|
||||
|
||||
$nachgereicht_am = $this->input->post('nachgereicht_am') == '' ? null : $this->input->post('nachgereicht_am');
|
||||
|
||||
$uid = getAuthUID();
|
||||
|
||||
$result = $this->AkteModel->update(
|
||||
@@ -180,7 +182,7 @@ class Dokumente extends FHCAPI_Controller
|
||||
'dokument_kurzbz' => $this->input->post('dokument_kurzbz'),
|
||||
'anmerkung_intern' => $this->input->post('anmerkung_intern'),
|
||||
'titel_intern' => $this->input->post('titel_intern'),
|
||||
'nachgereicht_am' => $this->input->post('nachgereicht_am'),
|
||||
'nachgereicht_am' => $nachgereicht_am,
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => $uid,
|
||||
]
|
||||
|
||||
@@ -429,9 +429,12 @@ class Konto extends FHCAPI_Controller
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => getAuthUID()
|
||||
];
|
||||
|
||||
foreach ($allowed as $field)
|
||||
if ($this->input->post($field) !== null)
|
||||
$data[$field] = $this->input->post($field);
|
||||
if($data['buchungsdatum'] == '')
|
||||
$data['buchungsdatum'] = null;
|
||||
|
||||
$result = $this->KontoModel->update($id, $data);
|
||||
|
||||
|
||||
@@ -237,8 +237,8 @@ class Mobility extends FHCAPI_Controller
|
||||
}
|
||||
$formData = $this->input->post('formData');
|
||||
|
||||
$von = $formData['von'] ?? null;
|
||||
$bis = $formData['bis'] ?? null;
|
||||
$von = ($formData['von'] ?? '') ?: null;
|
||||
$bis = ($formData['bis'] ?? '') ?: null;
|
||||
$nation_code = $formData['nation_code'] ?? null;
|
||||
$mobilitaetsprogramm_code = $formData['mobilitaetsprogramm_code'] ?? null;
|
||||
$herkunftsland_code = $formData['herkunftsland_code'] ?? null;
|
||||
|
||||
@@ -448,8 +448,10 @@ class Pruefung extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
|
||||
$datum = $this->input->post('datum') == '' ? null : $this->input->post('datum');
|
||||
if(intval($pruefung_id) > 0)
|
||||
{
|
||||
|
||||
$result = $this->PruefungModel->update(
|
||||
[
|
||||
'pruefung_id' => $pruefung_id
|
||||
@@ -459,7 +461,7 @@ class Pruefung extends FHCAPI_Controller
|
||||
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
|
||||
'note' => $this->input->post('note'),
|
||||
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
|
||||
'datum' => $this->input->post('datum'),
|
||||
'datum' => $datum,
|
||||
'anmerkung' => $this->input->post('anmerkung'),
|
||||
'updatevon' => $authUID,
|
||||
'updateamum' => date('c'),
|
||||
@@ -472,7 +474,7 @@ class Pruefung extends FHCAPI_Controller
|
||||
'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'),
|
||||
'datum' => $datum,
|
||||
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
|
||||
'note' => $this->input->post('note'),
|
||||
'anmerkung' => $this->input->post('anmerkung'),
|
||||
@@ -520,7 +522,7 @@ class Pruefung extends FHCAPI_Controller
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
'note' => $this->input->post('note'),
|
||||
'uebernahmedatum' => date('c'),
|
||||
'benotungsdatum' => $this->input->post('datum'),
|
||||
'benotungsdatum' => $datum,
|
||||
'insertamum' => date('c'),
|
||||
'insertvon' => $authUID,
|
||||
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
|
||||
@@ -555,7 +557,7 @@ class Pruefung extends FHCAPI_Controller
|
||||
], [
|
||||
'note' => $this->input->post('note'),
|
||||
'uebernahmedatum' => date('c'),
|
||||
'benotungsdatum' => $this->input->post('datum'),
|
||||
'benotungsdatum' => $datum,
|
||||
'updateamum' => date('c'),
|
||||
'updatevon' => $authUID,
|
||||
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
|
||||
|
||||
@@ -297,6 +297,10 @@ class Student extends FHCAPI_Controller
|
||||
$fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val);
|
||||
$update_person[$prop] = $fotoval;
|
||||
}
|
||||
else if ($prop == 'gebdatum')
|
||||
{
|
||||
$update_person[$prop] = ($val == '') ? null : $val;
|
||||
}
|
||||
else
|
||||
{
|
||||
$update_person[$prop] = $val;
|
||||
|
||||
@@ -103,6 +103,8 @@ class Students extends FHCAPI_Controller
|
||||
*/
|
||||
public function getIncoming($studiensemester_kurzbz)
|
||||
{
|
||||
$index_bezeichnung_mehrsprachig = $this->_getLanguageIndex();
|
||||
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', [
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
@@ -135,7 +137,7 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
@@ -149,6 +151,8 @@ class Students extends FHCAPI_Controller
|
||||
*/
|
||||
public function getOutgoing($studiensemester_kurzbz)
|
||||
{
|
||||
$index_bezeichnung_mehrsprachig = $this->_getLanguageIndex();
|
||||
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', [
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
@@ -194,7 +198,7 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
@@ -208,6 +212,7 @@ class Students extends FHCAPI_Controller
|
||||
*/
|
||||
public function getGemeinsamestudien($studiensemester_kurzbz)
|
||||
{
|
||||
$index_bezeichnung_mehrsprachig = $this->_getLanguageIndex();
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', [
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
@@ -239,7 +244,7 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
@@ -290,6 +295,8 @@ class Students extends FHCAPI_Controller
|
||||
{
|
||||
$stdsemEsc = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
|
||||
|
||||
$index_bezeichnung_mehrsprachig = $this->_getLanguageIndex();
|
||||
|
||||
$selectRT = "
|
||||
SELECT 1
|
||||
FROM public.tbl_rt_person
|
||||
@@ -444,7 +451,7 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
@@ -547,6 +554,7 @@ class Students extends FHCAPI_Controller
|
||||
$gruppe_kurzbz = null,
|
||||
$orgform_kurzbz = null
|
||||
) {
|
||||
$index_bezeichnung_mehrsprachig = $this->_getLanguageIndex();
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
if (!$this->StudiensemesterModel->isValidStudiensemester($studiensemester_kurzbz))
|
||||
@@ -591,10 +599,8 @@ class Students extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
@@ -620,6 +626,7 @@ class Students extends FHCAPI_Controller
|
||||
*/
|
||||
public function getPrestudent($studiensemester_kurzbz, $prestudent_id)
|
||||
{
|
||||
$index_bezeichnung_mehrsprachig = $this->_getLanguageIndex();
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
@@ -647,10 +654,8 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_id);
|
||||
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
@@ -664,6 +669,7 @@ class Students extends FHCAPI_Controller
|
||||
*/
|
||||
public function getStudent($studiensemester_kurzbz, $student_uid)
|
||||
{
|
||||
$index_bezeichnung_mehrsprachig = $this->_getLanguageIndex();
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
@@ -679,11 +685,9 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
|
||||
$this->studentlistlib->addWhere('s.student_uid', $student_uid);
|
||||
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
@@ -698,6 +702,8 @@ class Students extends FHCAPI_Controller
|
||||
*/
|
||||
public function getPerson($studiensemester_kurzbz, $person_id)
|
||||
{
|
||||
$index_bezeichnung_mehrsprachig = $this->_getLanguageIndex();
|
||||
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||
@@ -717,7 +723,7 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
@@ -731,6 +737,7 @@ class Students extends FHCAPI_Controller
|
||||
*/
|
||||
public function search($studiensemester_kurzbz)
|
||||
{
|
||||
$index_bezeichnung_mehrsprachig = $this->_getLanguageIndex();
|
||||
$this->addMeta('ci_method', __FUNCTION__);
|
||||
$this->addMeta('ci_params', array(
|
||||
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||
@@ -786,7 +793,7 @@ class Students extends FHCAPI_Controller
|
||||
|
||||
$this->addFilter($studiensemester_kurzbz);
|
||||
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->decodeTagsJsonInResult($data);
|
||||
@@ -818,4 +825,15 @@ class Students extends FHCAPI_Controller
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private function _getLanguageIndex()
|
||||
{
|
||||
$this->load->model('system/Sprache_model', 'SpracheModel');
|
||||
$this->SpracheModel->addSelect('index');
|
||||
$result = $this->SpracheModel->loadWhere(array('sprache' => getUserLanguage()));
|
||||
$language = hasData($result) ? getData($result)[0]->index : 1;
|
||||
$index_bezeichnung_mehrsprachig = $language - 1;
|
||||
|
||||
return $index_bezeichnung_mehrsprachig;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,9 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
|
||||
public function getTag($readonly_tags = null)
|
||||
{
|
||||
$language = $this->_getLanguageIndex();
|
||||
$index_bezeichnung_mehrsprachig = $language - 1;
|
||||
|
||||
$id = $this->input->get('id');
|
||||
|
||||
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
|
||||
@@ -66,7 +69,7 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
$this->NotizModel->addSelect(
|
||||
"tbl_notiz.titel,
|
||||
tbl_notiz.text,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
|
||||
tbl_notiz.notiz_id,
|
||||
tbl_notiz_typ.style,
|
||||
tbl_notiz_typ.automatisiert,
|
||||
@@ -96,10 +99,11 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
public function getTags($tags = null)
|
||||
{
|
||||
$language = $this->_getLanguageIndex();
|
||||
$index_bezeichnung_mehrsprachig = $language - 1;
|
||||
|
||||
$this->NotiztypModel->addSelect(
|
||||
"typ_kurzbz as tag_typ_kurzbz,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
|
||||
style,
|
||||
beschreibung,
|
||||
tag,
|
||||
@@ -283,6 +287,8 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
}
|
||||
|
||||
public function getAllTags($readonly_tags = false){
|
||||
$language = $this->_getLanguageIndex();
|
||||
$index_bezeichnung_mehrsprachig = $language - 1;
|
||||
$prestudent_id = $this->input->get('prestudent_id');
|
||||
|
||||
//TODO check for readonly: necessary?
|
||||
@@ -307,7 +313,7 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
$this->NotizModel->addSelect(
|
||||
"tbl_notiz.titel,
|
||||
tbl_notiz.text,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
|
||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $index_bezeichnung_mehrsprachig . " as bezeichnung,
|
||||
tbl_notiz.notiz_id,
|
||||
tbl_notiz_typ.style,
|
||||
tbl_notiz_typ.automatisiert,
|
||||
@@ -338,16 +344,27 @@ class Tag_Controller extends FHCAPI_Controller
|
||||
|
||||
public function rebuildTagsForTypeId()
|
||||
{
|
||||
$id = $this->input->post('id');
|
||||
$ids = $this->input->post('ids');
|
||||
$typeId = $this->input->post('typeId');
|
||||
$semester = $this->input->post('sem');
|
||||
|
||||
$result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester);
|
||||
$idsSuccess = [];
|
||||
$idsError = [];
|
||||
$outputResult = [];
|
||||
|
||||
if (isError($result))
|
||||
return error ('Error occurred during updateAutomatedTags');
|
||||
foreach ($ids as $id)
|
||||
{
|
||||
$result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester);
|
||||
|
||||
$this->terminateWithSuccess($result);
|
||||
if (isError($result))
|
||||
$idsError[] = $id;
|
||||
else
|
||||
$idsSuccess[] = $id;
|
||||
|
||||
$outputResult[] = $result;
|
||||
}
|
||||
|
||||
$this->terminateWithSuccess([$outputResult, $idsSuccess, $idsError]);
|
||||
}
|
||||
|
||||
private function _setAuthUID()
|
||||
|
||||
@@ -251,9 +251,9 @@ class StudentListLib
|
||||
*
|
||||
* @return stdClass result of the query
|
||||
*/
|
||||
public function execute($studiensemester_kurzbz)
|
||||
public function execute($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig=0)
|
||||
{
|
||||
$this->addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz);
|
||||
$this->addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig);
|
||||
|
||||
$stdsemEsc = $studiensemester_kurzbz ? $this->_ci->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
|
||||
|
||||
@@ -302,7 +302,7 @@ class StudentListLib
|
||||
* @param string studiensemester_kurzbz
|
||||
*
|
||||
*/
|
||||
protected function addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz)
|
||||
protected function addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz, $index_bezeichnung_mehrsprachig)
|
||||
{
|
||||
if (defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) {
|
||||
$this->_ci->load->config('stv');
|
||||
@@ -326,7 +326,7 @@ class StudentListLib
|
||||
SELECT DISTINCT ON (n.notiz_id)
|
||||
n.notiz_id AS id,
|
||||
nt.typ_kurzbz,
|
||||
array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
|
||||
array_to_json(nt.bezeichnung_mehrsprachig)->>". $index_bezeichnung_mehrsprachig . " AS beschreibung,
|
||||
n.text AS notiz,
|
||||
nt.style,
|
||||
n.erledigt AS done,
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
<?php
|
||||
/**
|
||||
* Description of out_auto
|
||||
*
|
||||
* @author ma0068
|
||||
*/
|
||||
class CoreIncomingTagLib
|
||||
{
|
||||
protected $ci;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->ci = get_instance();
|
||||
$this->ci->load->model('codex/Bisio_model', 'BisioModel');
|
||||
}
|
||||
|
||||
public function getZuordnungIds(array $params)
|
||||
{
|
||||
if(!isset($params['studiensemester_kurzbz']))
|
||||
{
|
||||
return (object) array(
|
||||
'idArray' => []
|
||||
);
|
||||
}
|
||||
|
||||
$semester = $params['studiensemester_kurzbz'];
|
||||
|
||||
$result = $this->ci->BisioModel->getIncomingsOfSemester($semester);
|
||||
|
||||
$data = $result->retval;
|
||||
|
||||
$outgoing_data = array_map(function($item) {
|
||||
return [
|
||||
'id' => $item->prestudent_id,
|
||||
'von' => $item->von,
|
||||
'bis' => $item->bis
|
||||
];
|
||||
}, $data);
|
||||
|
||||
return (object) array(
|
||||
'data' => $outgoing_data,
|
||||
'typeId' => 'prestudent_id',
|
||||
);
|
||||
}
|
||||
|
||||
public function isCriteriaSetFor(array $params)
|
||||
{
|
||||
if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
|
||||
return false;
|
||||
|
||||
$semester = $params['studiensemester_kurzbz'];
|
||||
$prestudent_id = $params['id'];
|
||||
|
||||
$result = $this->ci->BisioModel->isPrestudentIncoming($semester, $prestudent_id);
|
||||
|
||||
if (hasData($result)) {
|
||||
return $result;
|
||||
}
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<?php
|
||||
/**
|
||||
* Description of prewh_auto
|
||||
*
|
||||
* @author ma0068
|
||||
*/
|
||||
class CorePreabbrecherTagLib
|
||||
{
|
||||
protected $ci;
|
||||
const TYP_ABMELDUNG = ['Abmeldung', 'AbmeldungStgl'];
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->ci = get_instance();
|
||||
$this->ci->load->model('education/Studierendenantrag_model', 'StudierendenantragModel');
|
||||
}
|
||||
|
||||
public function getZuordnungIds(array $params)
|
||||
{
|
||||
if(!isset($params['studiensemester_kurzbz']))
|
||||
{
|
||||
return (object) array(
|
||||
'idArray' => []
|
||||
);
|
||||
}
|
||||
|
||||
$semester = $params['studiensemester_kurzbz'];
|
||||
|
||||
$this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||
$this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG);
|
||||
$this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester);
|
||||
$result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([
|
||||
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED
|
||||
]);
|
||||
|
||||
$data = $result->retval;
|
||||
|
||||
$prewiederholer_data = array_map(function($item) {
|
||||
return [
|
||||
'id' => $item->prestudent_id,
|
||||
'von' => $item->start,
|
||||
'bis' => $item->ende
|
||||
];
|
||||
}, $data);
|
||||
|
||||
return (object) array(
|
||||
'data' => $prewiederholer_data,
|
||||
'typeId' => 'prestudent_id',
|
||||
);
|
||||
}
|
||||
|
||||
public function isCriteriaSetFor(array $params)
|
||||
{
|
||||
if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'prestudent_id')
|
||||
return false;
|
||||
|
||||
$semester = $params['studiensemester_kurzbz'];
|
||||
$prestudent_id = $params['id'];
|
||||
|
||||
$this->ci->StudierendenantragModel->addSelect('prestudent_id');
|
||||
$this->ci->StudierendenantragModel->addSelect('start as von');
|
||||
$this->ci->StudierendenantragModel->addSelect('ende as bis');
|
||||
|
||||
$this->ci->StudierendenantragModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||
$this->ci->StudierendenantragModel->db->where_in('typ', self::TYP_ABMELDUNG);
|
||||
$this->ci->StudierendenantragModel->db->where('studiensemester_kurzbz', $semester);
|
||||
$this->ci->StudierendenantragModel->db->where('prestudent_id', $prestudent_id);
|
||||
$result = $this->ci->StudierendenantragModel->getWithLastStatusWhere([
|
||||
'studierendenantrag_statustyp_kurzbz' => Studierendenantragstatus_model::STATUS_CREATED
|
||||
]);
|
||||
|
||||
if(hasData($result))
|
||||
{
|
||||
return $result;
|
||||
}
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -73,6 +73,34 @@ class Bisio_model extends DB_Model
|
||||
return $this->execQuery($query, array($studiensemester_kurzbz));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets incoming students of certain Semester
|
||||
* @param String studiensemester_kurzbz
|
||||
* @return array of prestudent_ids
|
||||
*/
|
||||
public function getIncomingsOfSemester($studiensemester_kurzbz)
|
||||
{
|
||||
$query = "
|
||||
SELECT DISTINCT ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
|
||||
FROM bis.tbl_bisio
|
||||
JOIN public.tbl_student USING (student_uid)
|
||||
JOIN public.tbl_prestudent ps USING (prestudent_id)
|
||||
JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
|
||||
JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
|
||||
WHERE ss.studiensemester_kurzbz = ?
|
||||
AND nation_code = 'A'
|
||||
AND (
|
||||
tbl_bisio.von <= ss.ende
|
||||
AND (
|
||||
tbl_bisio.bis >= ss.start
|
||||
OR tbl_bisio.bis IS NULL
|
||||
)
|
||||
)
|
||||
";
|
||||
|
||||
return $this->execQuery($query, array($studiensemester_kurzbz));
|
||||
}
|
||||
|
||||
public function isPrestudentOutgoing($studiensemester_kurzbz, $prestudent_id)
|
||||
{
|
||||
$query = "
|
||||
@@ -97,4 +125,29 @@ class Bisio_model extends DB_Model
|
||||
|
||||
return $this->execQuery($query, array($studiensemester_kurzbz, $prestudent_id));
|
||||
}
|
||||
|
||||
public function isPrestudentIncoming($studiensemester_kurzbz, $prestudent_id)
|
||||
{
|
||||
$query = "
|
||||
SELECT
|
||||
ps.prestudent_id, tbl_bisio.von, tbl_bisio.bis
|
||||
FROM bis.tbl_bisio
|
||||
JOIN public.tbl_student USING (student_uid)
|
||||
JOIN public.tbl_prestudent ps USING (prestudent_id)
|
||||
JOIN public.tbl_prestudentstatus pss ON (ps.prestudent_id = pss.prestudent_id)
|
||||
JOIN public.tbl_studiensemester ss ON (pss.studiensemester_kurzbz = ss.studiensemester_kurzbz)
|
||||
WHERE ss.studiensemester_kurzbz = ?
|
||||
AND nation_code = 'A'
|
||||
AND (
|
||||
tbl_bisio.von <= ss.ende
|
||||
AND (
|
||||
tbl_bisio.bis >= ss.start
|
||||
OR tbl_bisio.bis IS NULL
|
||||
)
|
||||
)
|
||||
AND ps.prestudent_id = ?
|
||||
";
|
||||
|
||||
return $this->execQuery($query, array($studiensemester_kurzbz, $prestudent_id));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ class Dokument_model extends DB_Model
|
||||
|
||||
$qry = " SELECT
|
||||
a.akte_id,
|
||||
a.bezeichnung,
|
||||
dok.bezeichnung,
|
||||
a.dokument_kurzbz,
|
||||
a.titel_intern,
|
||||
a.anmerkung_intern,
|
||||
@@ -83,6 +83,7 @@ class Dokument_model extends DB_Model
|
||||
inhalt
|
||||
FROM
|
||||
public.tbl_akte a
|
||||
JOIN public.tbl_dokument dok ON (dok.dokument_kurzbz = a.dokument_kurzbz)
|
||||
WHERE
|
||||
a.person_id = ?
|
||||
AND a.dokument_kurzbz NOT IN (
|
||||
|
||||
@@ -91,6 +91,15 @@
|
||||
color: black;
|
||||
}
|
||||
|
||||
.tag_skyblue {
|
||||
background-color: #90D5FF;
|
||||
color: black;
|
||||
}
|
||||
.tag_blush {
|
||||
background-color: #A83E3E;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.tag_done {
|
||||
text-decoration: line-through;
|
||||
}
|
||||
|
||||
@@ -433,6 +433,7 @@ export default {
|
||||
:label="$p.t('wawi/ausgegebenam')"
|
||||
name="ausgegebenam"
|
||||
v-model="formData.ausgegebenam"
|
||||
model-type="yyyy-MM-dd"
|
||||
auto-apply
|
||||
:enable-time-picker="false"
|
||||
text-input
|
||||
@@ -449,6 +450,7 @@ export default {
|
||||
:label="$p.t('wawi/retouram')"
|
||||
name="retouram"
|
||||
v-model="formData.retouram"
|
||||
model-type="yyyy-MM-dd"
|
||||
auto-apply
|
||||
:enable-time-picker="false"
|
||||
text-input
|
||||
|
||||
@@ -315,8 +315,10 @@ export default {
|
||||
this.reload();
|
||||
},
|
||||
rebuildPrestudentTags(){
|
||||
const id = [this.headerData[0].prestudent_id];
|
||||
|
||||
const params = {
|
||||
id : this.headerData[0].prestudent_id,
|
||||
ids: id,
|
||||
typeId: 'prestudent_id',
|
||||
sem: this.currentSemester
|
||||
};
|
||||
|
||||
@@ -551,6 +551,7 @@ export default {
|
||||
container-class="mb-3 col-3"
|
||||
type="DatePicker"
|
||||
v-model="formData.datum_von"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="datum_von"
|
||||
:label="$p.t('ui/from') + ' *'"
|
||||
auto-apply
|
||||
@@ -566,6 +567,7 @@ export default {
|
||||
container-class="mb-3 col-3"
|
||||
type="DatePicker"
|
||||
v-model="formData.datum_bis"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="datum_bis"
|
||||
:label="$p.t('global/bis')"
|
||||
auto-apply
|
||||
|
||||
@@ -478,6 +478,18 @@ export default {
|
||||
},
|
||||
showAlertNoSelectedStudent(){
|
||||
this.$fhcAlert.alertError(this.$p.t('ui', 'alert_chooseStudent'));
|
||||
},
|
||||
showAlertMultipleStudents() {
|
||||
this.$fhcAlert.alertError(this.$p.t('ui', 'alert_chooseOnlyOneStudent'));
|
||||
},
|
||||
showAlertNoGroupChosen(){
|
||||
this.$fhcAlert.alertError(this.$p.t('ui', 'alert_chooseGroupSem'));
|
||||
},
|
||||
showMenu(refName) {
|
||||
bootstrap.Dropdown.getOrCreateInstance(this.$refs[refName]).show();
|
||||
},
|
||||
hideMenu(refName) {
|
||||
bootstrap.Dropdown.getOrCreateInstance(this.$refs[refName]).hide();
|
||||
}
|
||||
},
|
||||
created() {
|
||||
@@ -653,19 +665,30 @@ export default {
|
||||
</div>
|
||||
<div class="offcanvas-body">
|
||||
<app-menu app-identifier="stv">
|
||||
<li class="dropend">
|
||||
<li :class="{ dropend: appMenuExtraItems.length }"
|
||||
@mouseenter="appMenuExtraItems.length && showMenu('gradeReportToggle')"
|
||||
@mouseleave="appMenuExtraItems.length && hideMenu('gradeReportToggle')"
|
||||
>
|
||||
<a
|
||||
ref="gradeReportToggle"
|
||||
v-if="appMenuExtraItems.length"
|
||||
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">
|
||||
<a
|
||||
v-else
|
||||
href="#"
|
||||
@click.prevent="showAlertNoGroupChosen"
|
||||
>
|
||||
{{ $p.t('stv/grade_report') }}
|
||||
</a>
|
||||
<ul v-if="appMenuExtraItems.length" class="dropdown-menu p-0">
|
||||
<li
|
||||
v-for="(item, key) in appMenuExtraItems"
|
||||
:key="key"
|
||||
@@ -676,19 +699,30 @@ export default {
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropend">
|
||||
<li :class="{ dropend: appMenuExtraItems.length }"
|
||||
@mouseenter="appMenuExtraItems.length && showMenu('lvPlanungToggle')"
|
||||
@mouseleave="appMenuExtraItems.length && hideMenu('lvPlanungToggle')"
|
||||
>
|
||||
<a
|
||||
ref="lvPlanungToggle"
|
||||
v-if="appMenuExtraItems.length"
|
||||
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/lvplanung') }}
|
||||
</a>
|
||||
<a
|
||||
v-else
|
||||
href="#"
|
||||
@click.prevent="showAlertNoGroupChosen"
|
||||
>
|
||||
{{ $p.t('stv/lvplanung') }}
|
||||
</a>
|
||||
<ul class="dropdown-menu p-0">
|
||||
<ul v-if="appMenuExtraItems.length" class="dropdown-menu p-0">
|
||||
<li
|
||||
v-for="(item, key) in appMenuLvPlanungItems"
|
||||
:key="key"
|
||||
@@ -705,10 +739,13 @@ export default {
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a v-if="selected_uid" :href="linkGradeList" target="_blank">
|
||||
<a v-if="selected.length === 1" :href="linkGradeList" target="_blank">
|
||||
{{ $p.t('stv/studienverlauf') }}
|
||||
</a>
|
||||
<a v-else href="#" @click.prevent="showAlertNoSelectedStudent">
|
||||
<a v-else-if="selected.length === 0" href="#" @click.prevent="showAlertNoSelectedStudent">
|
||||
{{ $p.t('stv/studienverlauf') }}
|
||||
</a>
|
||||
<a v-else href="#" @click.prevent="showAlertMultipleStudents">
|
||||
{{ $p.t('stv/studienverlauf') }}
|
||||
</a>
|
||||
</li>
|
||||
|
||||
+1
@@ -470,6 +470,7 @@ export default {
|
||||
:label="$p.t('admission', 'anmeldundRtAm')"
|
||||
type="DatePicker"
|
||||
v-model="formData.anmeldedatum"
|
||||
model-type="yyyy-MM-dd"
|
||||
auto-apply
|
||||
:enable-time-picker="false"
|
||||
text-input
|
||||
|
||||
@@ -303,6 +303,7 @@ export default {
|
||||
:label="$p.t('person', 'geburtsdatum')"
|
||||
type="DatePicker"
|
||||
v-model="data.gebdatum"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="gebdatum"
|
||||
:clearable="false"
|
||||
no-today
|
||||
|
||||
@@ -20,7 +20,6 @@ export default {
|
||||
layoutColumnsOnNewData: false,
|
||||
height: 300,
|
||||
listDocuments: [],
|
||||
prestudentDocumentData: [],
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -68,21 +67,36 @@ export default {
|
||||
let value = cell.getValue();
|
||||
let rowData = cell.getRow().getData(); // Zugriff auf gesamte Zeile
|
||||
let dueDate = rowData["nachgereicht_am"];
|
||||
const date = new Date(dueDate);
|
||||
let dateFormatted = date.toLocaleString("de-DE", {
|
||||
|
||||
let vorhanden = rowData["vorhanden"];
|
||||
let hochgeladenamum = vorhanden ? rowData["hochgeladenamum"] : '';
|
||||
|
||||
const dateDue = new Date(dueDate);
|
||||
let dateFormatted = dateDue.toLocaleString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric",
|
||||
hour12: false
|
||||
});
|
||||
|
||||
let hochgeladenamumFormatted = hochgeladenamum
|
||||
? new Date(hochgeladenamum.replace(" ", "T")).toLocaleDateString("de-DE", {
|
||||
day: "2-digit",
|
||||
month: "2-digit",
|
||||
year: "numeric"
|
||||
})
|
||||
: dateFormatted;
|
||||
|
||||
|
||||
const date = vorhanden && hochgeladenamum ? hochgeladenamumFormatted : dateFormatted;
|
||||
|
||||
let tickCrossIcon = value
|
||||
? '<i class="fa fa-check text-success"></i>'
|
||||
: '<i class="fa fa-xmark text-danger"></i>';
|
||||
|
||||
// if nachgereicht_am show datum
|
||||
// if nachgereicht_am show datum nachgereicht_am oder hochgeladenamum
|
||||
let pill = dueDate
|
||||
? `<span>${dateFormatted}</span>`
|
||||
? `<span>${date}</span>`
|
||||
: '';
|
||||
|
||||
return `${tickCrossIcon} ${pill}`;
|
||||
@@ -206,7 +220,7 @@ export default {
|
||||
setHeader('anmerkung_intern', this.$p.t('global', 'anmerkung'));
|
||||
setHeader('akte_id', this.$p.t('global', 'akte_id'));
|
||||
setHeader('pflicht', this.$p.t('ampeln', 'mandatory'));
|
||||
setHeader('nachgereicht_am', this.$p.t('global', 'dokument'));
|
||||
setHeader('nachgereicht_am', this.$p.t('dokumente', 'nachreichungAm'));
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -103,6 +103,7 @@ export default {
|
||||
<form-input
|
||||
type="DatePicker"
|
||||
v-model="formData.nachgereicht_am"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="nachgereicht_am"
|
||||
:label="$p.t('dokumente/nachreichungAm')"
|
||||
auto-apply
|
||||
|
||||
@@ -27,7 +27,7 @@ export default {
|
||||
return {
|
||||
filter: false,
|
||||
studiengang_kz: false,
|
||||
counterdate: new Date()
|
||||
counterdate: luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate()
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -259,6 +259,7 @@ export default {
|
||||
<form-input
|
||||
type="DatePicker"
|
||||
v-model="counterdate"
|
||||
model-type="yyyy-MM-dd"
|
||||
input-group
|
||||
:enable-time-picker="false"
|
||||
text-input
|
||||
|
||||
@@ -79,6 +79,7 @@ export default {
|
||||
<form-input
|
||||
type="DatePicker"
|
||||
v-model="data.buchungsdatum"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="buchungsdatum"
|
||||
:label="$p.t('konto/buchungsdatum')"
|
||||
:enable-time-picker="false"
|
||||
|
||||
@@ -88,7 +88,7 @@ export default {
|
||||
this.data = {
|
||||
buchungstyp_kurzbz: '',
|
||||
betrag: '-0.00',
|
||||
buchungsdatum: new Date(),
|
||||
buchungsdatum: luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate(),
|
||||
buchungstext: '',
|
||||
mahnspanne: 30,
|
||||
studiensemester_kurzbz: this.currentSemester,
|
||||
@@ -154,6 +154,7 @@ export default {
|
||||
<form-input
|
||||
type="DatePicker"
|
||||
v-model="data.buchungsdatum"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="buchungsdatum"
|
||||
:label="$p.t('konto/buchungsdatum')"
|
||||
:enable-time-picker="false"
|
||||
|
||||
@@ -467,6 +467,7 @@ export default {
|
||||
:label="$p.t('ui', 'von')"
|
||||
type="DatePicker"
|
||||
v-model="formData.von"
|
||||
model-type="yyyy-MM-dd"
|
||||
auto-apply
|
||||
:enable-time-picker="false"
|
||||
text-input
|
||||
@@ -501,6 +502,7 @@ export default {
|
||||
:label="$p.t('global', 'bis')"
|
||||
type="DatePicker"
|
||||
v-model="formData.bis"
|
||||
model-type="yyyy-MM-dd"
|
||||
auto-apply
|
||||
:enable-time-picker="false"
|
||||
text-input
|
||||
|
||||
@@ -325,6 +325,7 @@ export default {
|
||||
:label="$p.t('infocenter', 'zgvDatum')"
|
||||
type="DatePicker"
|
||||
v-model="data.zgvdatum"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="zgvdatum"
|
||||
no-today
|
||||
auto-apply
|
||||
@@ -389,6 +390,7 @@ export default {
|
||||
:label="$p.t('lehre', 'zgvMasterDatum')"
|
||||
type="DatePicker"
|
||||
v-model="data.zgvmadatum"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="zgvmadatum"
|
||||
no-today
|
||||
auto-apply
|
||||
@@ -454,6 +456,7 @@ export default {
|
||||
:label="$p.t('lehre', 'zgvDoktorDatum')"
|
||||
type="DatePicker"
|
||||
v-model="data.zgvdoktordatum"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="zgvdoktordatum"
|
||||
no-today
|
||||
auto-apply
|
||||
|
||||
@@ -276,6 +276,7 @@ export default{
|
||||
container-class="mb-3"
|
||||
type="DatePicker"
|
||||
v-model="formData.datum"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="datum"
|
||||
:label="$p.t('global/datum')"
|
||||
auto-apply
|
||||
@@ -291,6 +292,7 @@ export default{
|
||||
container-class="mb-3"
|
||||
type="DatePicker"
|
||||
v-model="formData.bestaetigtam"
|
||||
model-type="yyyy-MM-dd"
|
||||
name="bestaetigtam"
|
||||
:label="$p.t('lehre/bestaetigt_am')"
|
||||
auto-apply
|
||||
@@ -306,13 +308,14 @@ export default{
|
||||
container-class="mb-3"
|
||||
type="DatePicker"
|
||||
v-model="formData.bewerbung_abgeschicktamum"
|
||||
model-type="yyyy-MM-dd HH:mm:ss"
|
||||
name="bewerbung_abgeschicktamum"
|
||||
:label="$p.t('lehre/bewerbung_abgeschickt_am')"
|
||||
auto-apply
|
||||
:enable-time-picker="false"
|
||||
format="dd.MM.yyyy"
|
||||
:enable-time-picker="true"
|
||||
format="dd.MM.yyyy HH:mm:ss"
|
||||
text-input
|
||||
preview-format="dd.MM.yyyy"
|
||||
preview-format="dd.MM.yyyy HH:mm:ss"
|
||||
:teleport="true"
|
||||
:disabled="bisLocked || !hasPrestudentstatusPermission"
|
||||
>
|
||||
|
||||
@@ -4,6 +4,7 @@ import CoreTag from '../../Tag/Tag.js';
|
||||
import { tagHeaderFilter } from "../../../tabulator/filters/extendedHeaderFilter.js";
|
||||
import { addTagInTable, deleteTagInTable, updateTagInTable } from "../../../../js/helpers/TagHelper.js";
|
||||
import { tagFormatter } from "../../../../js/tabulator/formatter/tags.js";
|
||||
import ModalLoading from "./List/ModalLoading.js";
|
||||
|
||||
import ApiTag from "../../../api/factory/stv/tag.js";
|
||||
import ListFilter from './List/Filter.js';
|
||||
@@ -18,7 +19,8 @@ export default {
|
||||
CoreFilterCmpt,
|
||||
ListNew,
|
||||
CoreTag,
|
||||
ListFilter
|
||||
ListFilter,
|
||||
ModalLoading
|
||||
},
|
||||
directives: {
|
||||
draggable
|
||||
@@ -246,7 +248,9 @@ export default {
|
||||
oldScrollUrl: '',
|
||||
oldScrollLeft: 0,
|
||||
oldScrollTop: 0,
|
||||
allPrestudents: []
|
||||
allPrestudents: [],
|
||||
rebuildData: [],
|
||||
isLoading: false
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
@@ -646,11 +650,55 @@ export default {
|
||||
this.oldScrollUrl = this.$refs.table.tabulator.getAjaxUrl();
|
||||
}
|
||||
},
|
||||
rebuild(selected){
|
||||
this.isLoading = true;
|
||||
let prestudentIds = [];
|
||||
this.showModal();
|
||||
if(!selected.length)
|
||||
prestudentIds = this.$refs.table.tabulator
|
||||
.getData()
|
||||
.map(row => row.prestudent_id);
|
||||
else
|
||||
prestudentIds = selected.map(item => item.prestudent_id);
|
||||
|
||||
const params = {
|
||||
ids: prestudentIds,
|
||||
typeId: 'prestudent_id',
|
||||
sem: this.studiensemesterKurzbz
|
||||
};
|
||||
|
||||
return this.$api
|
||||
.call(ApiTag.rebuildTagsforTypeId(params))
|
||||
.then(result => {
|
||||
this.rebuildData = result.data;
|
||||
this.isLoading = false;
|
||||
console.log("Rebuild manually triggered");
|
||||
if(this.rebuildData[1].length > 0)
|
||||
{
|
||||
this.$fhcAlert.alertSuccess(this.$p.t('tag', 'alertSuccessRebuild', { count: this.rebuildData[1].length }));
|
||||
}
|
||||
if(this.rebuildData[2].length > 0)
|
||||
{
|
||||
this.$fhcAlert.alertError(this.$p.t('tag', 'alertErrorRebuild') + this.rebuildData[2].toString());
|
||||
}
|
||||
})
|
||||
.catch(this.$fhcAlert.handleSystemError);
|
||||
},
|
||||
showModal(){
|
||||
this.$refs.modalLocked.open();
|
||||
},
|
||||
},
|
||||
// TODO(chris): focusin, focusout, keydown and tabindex should be in the filter component
|
||||
// TODO(chris): filter component column chooser has no accessibilty features
|
||||
template: `
|
||||
<div class="stv-list h-100 pt-3">
|
||||
<modal-loading
|
||||
ref="modalLocked"
|
||||
:isLoading="isLoading"
|
||||
:message="$p.t('tag','messageModalWait')"
|
||||
>
|
||||
</modal-loading>
|
||||
|
||||
<div
|
||||
class="tabulator-container d-flex flex-column h-100"
|
||||
:class="{'has-filter': filter.length}"
|
||||
@@ -709,6 +757,23 @@ export default {
|
||||
zuordnung_typ="prestudent_id"
|
||||
></core-tag>
|
||||
|
||||
<button
|
||||
v-if="!selected.length"
|
||||
class="btn btn-outline btn-light mb-1"
|
||||
@click="rebuild(selected)"
|
||||
:title="$p.t('tag','rebuild_tags') + ' Stg ' + currentSemester"
|
||||
>
|
||||
<i class="fa-solid fa-refresh pe-1"></i> STG
|
||||
</button>
|
||||
<button
|
||||
v-else
|
||||
class="btn btn-outline btn-light mb-1"
|
||||
@click="rebuild(selected)"
|
||||
:title="$p.t('tag','rebuild_tags') + ' ' + $p.t('ui','selection') + ' ' + currentSemester"
|
||||
>
|
||||
<i class="fa-solid fa-refresh pe-1"></i> {{selected.length}}
|
||||
</button>
|
||||
|
||||
<template v-if="filter.length || headerFilterActive">
|
||||
<div class="d-flex justify-content-center align-items-center gap-2 ps-4 position-absolute start-50 translate-middle-x">
|
||||
<p class="text-danger mb-0">
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
import BsModal from "../../../Bootstrap/Modal.js";
|
||||
import FormForm from "../../../Form/Form.js";
|
||||
|
||||
export default {
|
||||
name: "modalLoading",
|
||||
components: {
|
||||
BsModal,
|
||||
FormForm
|
||||
},
|
||||
props: {
|
||||
isLoading: {
|
||||
type: Boolean,
|
||||
required: true
|
||||
},
|
||||
message: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
data(){
|
||||
return{}
|
||||
},
|
||||
methods:{
|
||||
open(){
|
||||
this.$refs.modalLoading.show();
|
||||
},
|
||||
closeModal(){
|
||||
this.$refs.modalLoading.hide();
|
||||
}
|
||||
},
|
||||
template: `
|
||||
<bs-modal
|
||||
ref="modalLoading"
|
||||
noCloseBtn
|
||||
backdrop='static'
|
||||
:keyboard='false'
|
||||
dialog-class="modal-dialog-scrollable"
|
||||
>
|
||||
<template #title>
|
||||
Loading
|
||||
</template>
|
||||
|
||||
<form-form
|
||||
ref="formModal"
|
||||
>
|
||||
<div class="mt-3">
|
||||
<div v-if="isLoading">
|
||||
{{message}}
|
||||
</div>
|
||||
<div v-else>
|
||||
{{$p.t('ui', 'fenster_schliessen')}}
|
||||
</div>
|
||||
</div>
|
||||
</form-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="d-grid gap-2 d-md-flex justify-content-md-end">
|
||||
<button
|
||||
class="btn btn-primary"
|
||||
:disabled="isLoading"
|
||||
@click="closeModal()">
|
||||
{{$p.t('ui', 'schliessen')}}
|
||||
</button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
</bs-modal>
|
||||
`,
|
||||
}
|
||||
@@ -285,6 +285,7 @@ export default {
|
||||
uid="stv-list-new-gebdatum"
|
||||
name="gebdatum"
|
||||
v-model="formDataPerson['gebdatum']"
|
||||
model-type="yyyy-MM-dd"
|
||||
:disabled="!!person"
|
||||
@update:model-value="loadSuggestions"
|
||||
text-input
|
||||
|
||||
@@ -6,9 +6,52 @@ export function addTagInTable(addedTag, rows, matchKey, tagsKey = "tags")
|
||||
rows.forEach(row =>
|
||||
{
|
||||
const rowData = row.getData();
|
||||
let updated = false;
|
||||
|
||||
addedTag.response.forEach(tag =>
|
||||
//add save check if String or Array and avoid same reference later for mutations
|
||||
let raw = rowData[tagsKey];
|
||||
let tags = typeof raw === "string"
|
||||
? JSON.parse(raw || "[]")
|
||||
: Array.isArray(raw)
|
||||
? [...raw]
|
||||
: [];
|
||||
|
||||
let updated = false;
|
||||
for (const tag of addedTag.response)
|
||||
{
|
||||
if (rowData[matchKey] !== tag[matchKey])
|
||||
continue;
|
||||
|
||||
//avoid double inserts
|
||||
if (tags.some(x => x.id === tag.id))
|
||||
continue;
|
||||
|
||||
const newTag = {
|
||||
id: tag.id,
|
||||
prestudent_id: tag.prestudent_id,
|
||||
//add also information of addedTag
|
||||
beschreibung: addedTag.beschreibung,
|
||||
notiz: addedTag.notiz ?? "",
|
||||
style: addedTag.style,
|
||||
done: addedTag.done ?? false,
|
||||
typ_kurzbz: addedTag.tag_typ_kurzbz ?? addedTag.typ_kurzbz, //here seem to be 2 variations
|
||||
automatisiert: addedTag.automatisiert
|
||||
};
|
||||
|
||||
tags.unshift(newTag);
|
||||
updated = true;
|
||||
}
|
||||
|
||||
if (updated)
|
||||
{
|
||||
row.update({
|
||||
[tagsKey]: JSON.stringify(tags)
|
||||
});
|
||||
|
||||
row.reformat();
|
||||
}
|
||||
});
|
||||
|
||||
/* addedTag.response.forEach(tag =>
|
||||
{
|
||||
if (rowData[matchKey] !== tag[matchKey])
|
||||
return;
|
||||
@@ -36,7 +79,7 @@ export function addTagInTable(addedTag, rows, matchKey, tagsKey = "tags")
|
||||
|
||||
if (updated)
|
||||
row.update(rowData);
|
||||
});
|
||||
});*/
|
||||
}
|
||||
|
||||
export function deleteTagInTable(deletedTag, rows, tagsKeys = ['tags'])
|
||||
@@ -49,26 +92,30 @@ export function deleteTagInTable(deletedTag, rows, tagsKeys = ['tags'])
|
||||
let updates = {};
|
||||
let changed = false;
|
||||
|
||||
tagsKeys.forEach(key => {
|
||||
let tags;
|
||||
for (const key of tagsKeys) {
|
||||
let raw = rowData[key];
|
||||
let tags = [];
|
||||
|
||||
try {
|
||||
tags = JSON.parse(rowData[key] || "[]");
|
||||
if (typeof raw === "string") {
|
||||
tags = JSON.parse(raw || "[]");
|
||||
} else if (Array.isArray(raw)) {
|
||||
tags = [...raw];
|
||||
}
|
||||
} catch (e) {
|
||||
tags = [];
|
||||
}
|
||||
|
||||
if (!Array.isArray(tags))
|
||||
return;
|
||||
continue;
|
||||
|
||||
let filtered = tags.filter(tag => tag?.id !== deletedTag);
|
||||
|
||||
if (filtered.length !== tags.length)
|
||||
{
|
||||
if (filtered.length !== tags.length) {
|
||||
updates[key] = JSON.stringify(filtered);
|
||||
changed = true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
row.update(updates);
|
||||
|
||||
@@ -49,6 +49,10 @@ export function tagFormatter(cell, tagComponent)
|
||||
tagElement.title = tag.notiz;
|
||||
tagElement.className = "tag " + tag.style;
|
||||
if (tag.done) tagElement.className += " tag_done";
|
||||
if (tag.automatisiert){
|
||||
tagElement.className += " tag_auto";
|
||||
tagElement.innerHTML = "<i class='fa-solid fa-lock'></i> " + tag.beschreibung;
|
||||
}
|
||||
|
||||
const tagDef = mappedData.find(t => t.typ_kurzbz === tag.typ_kurzbz);
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ if(!@$db->db_query("SELECT taglib FROM public.tbl_notiz_typ LIMIT 1"))
|
||||
$tags = [
|
||||
[
|
||||
'typ_kurzbz' => 'wh_auto',
|
||||
'bezeichnung' => '{WH, R}',
|
||||
'bezeichnung' => '{WH, WH}',
|
||||
'style' => 'tag_dark_grey',
|
||||
'prioritaet' => 11,
|
||||
'taglib' => 'tags/CoreWiederholerTagLib'
|
||||
@@ -30,14 +30,14 @@ $tags = [
|
||||
],
|
||||
[
|
||||
'typ_kurzbz' => 'out_auto',
|
||||
'bezeichnung' => '{Out, Out}',
|
||||
'bezeichnung' => '{Outgoing, Outgoing}',
|
||||
'style' => 'tag_limette',
|
||||
'prioritaet' => 12,
|
||||
'taglib' => 'tags/CoreOutgoingTagLib'
|
||||
],
|
||||
[
|
||||
'typ_kurzbz' => 'prewh_auto',
|
||||
'bezeichnung' => '{Pre-WH, pre-R}',
|
||||
'bezeichnung' => '{Pre-WH, pre-WH}',
|
||||
'style' => 'tag_light_grey',
|
||||
'prioritaet' => 13,
|
||||
'taglib' => 'tags/CorePrewiederholerTagLib'
|
||||
@@ -51,7 +51,7 @@ $tags = [
|
||||
],
|
||||
[
|
||||
'typ_kurzbz' => 'unterbrecher_auto',
|
||||
'bezeichnung' => '{UB, I}',
|
||||
'bezeichnung' => '{UB, UB}',
|
||||
'style' => 'tag_turquoise',
|
||||
'prioritaet' => 15,
|
||||
'taglib' => 'tags/CoreUnterbrecherTagLib'
|
||||
@@ -70,6 +70,20 @@ $tags = [
|
||||
'prioritaet' => 17,
|
||||
'taglib' => 'tags/CoreJgvTagLib'
|
||||
],
|
||||
[
|
||||
'typ_kurzbz' => 'preabbr_auto',
|
||||
'bezeichnung' => '{Pre-Abbr, pre-Abbr}',
|
||||
'style' => 'tag_blush',
|
||||
'prioritaet' => 18,
|
||||
'taglib' => 'tags/CorePreabbrecherTagLib'
|
||||
],
|
||||
[
|
||||
'typ_kurzbz' => 'in_auto',
|
||||
'bezeichnung' => '{Incoming, Incoming}',
|
||||
'style' => 'tag_skyblue',
|
||||
'prioritaet' => 19,
|
||||
'taglib' => 'tags/CoreIncomingTagLib'
|
||||
],
|
||||
|
||||
];
|
||||
|
||||
|
||||
@@ -43059,6 +43059,7 @@ array(
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'ATTENTION! This exam grade was not included in the certificate because the certificate grade was changed after the exam date',
|
||||
/** @lang text */
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
@@ -60898,6 +60899,46 @@ I have been informed that I am under no obligation to consent to the transmissio
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'alert_chooseOnlyOneStudent',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Bitte nur eine/n Studierende/n markieren!',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Please select only one student!',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'alert_chooseGroupSem',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Bitte eine Gruppe auswählen!',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Please select a group!',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
@@ -60938,6 +60979,128 @@ I have been informed that I am under no obligation to consent to the transmissio
|
||||
)
|
||||
)
|
||||
),
|
||||
//Start Finetuning StudVW
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'fenster_schliessen',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Sie können nun das Fenster schließen',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'This window can be closed now',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'tag',
|
||||
'phrase' => 'rebuild_tags',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Neuberechnen Tags',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Rebuild Tags',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'ui',
|
||||
'phrase' => 'selection',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Auswahl',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'selection',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'tag',
|
||||
'phrase' => 'messageModalWait',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Bitte warten Sie, bis alle Tags neu berechnet wurden!',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Please wait until all tags have been recalculated!',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'tag',
|
||||
'phrase' => 'alertSuccessRebuild',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Tags erfolgreich neuberechnet ({count} Prestudent*innnen)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Tags successfully recalculated ({count} prestudents)',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'app' => 'core',
|
||||
'category' => 'tag',
|
||||
'phrase' => 'alertErrorRebuild',
|
||||
'insertvon' => 'system',
|
||||
'phrases' => array(
|
||||
array(
|
||||
'sprache' => 'German',
|
||||
'text' => 'Fehler bei Neuberechnen Tags, PrestudentId(s): ',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
),
|
||||
array(
|
||||
'sprache' => 'English',
|
||||
'text' => 'Error during Recalculating tags, PrestudentId(s): ',
|
||||
'description' => '',
|
||||
'insertvon' => 'system'
|
||||
)
|
||||
)
|
||||
),
|
||||
//End Finetuning StudVW
|
||||
);
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user