mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-07-25 00:24:35 +00:00
Compare commits
128
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d4929c8e22 | ||
|
|
194b74e390 | ||
|
|
ee70e43bfb | ||
|
|
f8d8d501ca | ||
|
|
7e6d670d82 | ||
|
|
f3a3bfcab6 | ||
|
|
2e33722674 | ||
|
|
b5e65cf072 | ||
|
|
c194e94b5c | ||
|
|
6d23f2b9fa | ||
|
|
fb1c7f8e90 | ||
|
|
093e3d5c97 | ||
|
|
9bc9e57deb | ||
|
|
9948060ed8 | ||
|
|
06ec020c1c | ||
|
|
01f2099c28 | ||
|
|
ff38731077 | ||
|
|
3e8445304c | ||
|
|
3e48401a04 | ||
|
|
d680c3aa2b | ||
|
|
d98bdb9745 | ||
|
|
90907d4276 | ||
|
|
f751df55b6 | ||
|
|
ecd6588ead | ||
|
|
e7c133586b | ||
|
|
d5ee6f9cc2 | ||
|
|
a721c1d14d | ||
|
|
c7bac03429 | ||
|
|
07d3b32279 | ||
|
|
245d0d3369 | ||
|
|
d3d04c5a77 | ||
|
|
ac6aa28680 | ||
|
|
f6f58642f5 | ||
|
|
57eec98604 | ||
|
|
1561aa55b7 | ||
|
|
35f4d23308 | ||
|
|
bb366e4117 | ||
|
|
c099eec7a7 | ||
|
|
0962e62e69 | ||
|
|
dcd6cfd74b | ||
|
|
5caab182b2 | ||
|
|
baaf941f25 | ||
|
|
2e5e7afb4d | ||
|
|
2c4626fd1a | ||
|
|
178638c006 | ||
|
|
981c97173e | ||
|
|
49d5c46133 | ||
|
|
9fb00f6cbd | ||
|
|
7d3096c2e8 | ||
|
|
ef2f9630a9 | ||
|
|
4d3c73c78f | ||
|
|
1e226f4515 | ||
|
|
ca8fe5bd19 | ||
|
|
d4e170037b | ||
|
|
7aba7aefb9 | ||
|
|
e5ae400686 | ||
|
|
1b822fc8f8 | ||
|
|
368eded1fd | ||
|
|
dbcacdddd6 | ||
|
|
8b2ef4e832 | ||
|
|
6fedb4b108 | ||
|
|
905c69c384 | ||
|
|
6fa0a7c102 | ||
|
|
7320dc448e | ||
|
|
ede9323224 | ||
|
|
3dcf72d679 | ||
|
|
8ce67a4726 | ||
|
|
bcfdf1e05c | ||
|
|
cb744799bd | ||
|
|
90ebee25fe | ||
|
|
3e8ed231a6 | ||
|
|
4c67b9d267 | ||
|
|
c16cf342cb | ||
|
|
d843f05922 | ||
|
|
44e9b4dff1 | ||
|
|
bda42ab347 | ||
|
|
b5b69878b8 | ||
|
|
6f17ddbbdf | ||
|
|
ef1347c7d5 | ||
|
|
d1fa5f64c4 | ||
|
|
21eb95bb23 | ||
|
|
e856c8ad6b | ||
|
|
2723d6a741 | ||
|
|
e5e22931a9 | ||
|
|
21ea277aaf | ||
|
|
2c0badf67c | ||
|
|
5e72161ab0 | ||
|
|
903f3b99b3 | ||
|
|
df9edc36e0 | ||
|
|
39f1716ae2 | ||
|
|
c7b25e6632 | ||
|
|
695f3455e6 | ||
|
|
1339077b57 | ||
|
|
3aebccbb9d | ||
|
|
ee6f28c06d | ||
|
|
fdb037da96 | ||
|
|
49cbbfc50c | ||
|
|
4f8e98f5d5 | ||
|
|
e9e614aa52 | ||
|
|
50af6694d0 | ||
|
|
5dbddb4beb | ||
|
|
b20613f5d7 | ||
|
|
0621564be7 | ||
|
|
f1714db09e | ||
|
|
70b025da30 | ||
|
|
87dd858358 | ||
|
|
51f3edcd72 | ||
|
|
e7f626bd72 | ||
|
|
17f94aabdf | ||
|
|
c49e32c4ac | ||
|
|
df124db84a | ||
|
|
29a4b4aadc | ||
|
|
2682ea75ab | ||
|
|
b3a63a60e9 | ||
|
|
a54dfaf0c7 | ||
|
|
595538d6bb | ||
|
|
a5329e5bba | ||
|
|
37a79c4589 | ||
|
|
dd760f8210 | ||
|
|
dd87e893ba | ||
|
|
127ce312ea | ||
|
|
2237e9f1b7 | ||
|
|
9b4fa132dc | ||
|
|
daf332a102 | ||
|
|
c127c0900e | ||
|
|
fc01fa045e | ||
|
|
f57dc6785b | ||
|
|
cf59bcff12 |
@@ -170,6 +170,13 @@ $config['navigation_header'] = array(
|
|||||||
'expand' => true,
|
'expand' => true,
|
||||||
'sort' => 51,
|
'sort' => 51,
|
||||||
'requiredPermissions' => 'vertrag/mitarbeiter:r'
|
'requiredPermissions' => 'vertrag/mitarbeiter:r'
|
||||||
|
),
|
||||||
|
'studierendenverwaltung' => array(
|
||||||
|
'link' => site_url('studentenverwaltung'),
|
||||||
|
'description' => 'Studierendenverwaltung',
|
||||||
|
'expand' => true,
|
||||||
|
'sort' => 52,
|
||||||
|
'requiredPermissions' => ['admin:r', 'assistenz:r']
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
@@ -378,7 +385,7 @@ $config['navigation_menu']['apps'] = [
|
|||||||
],
|
],
|
||||||
'lav' => [
|
'lav' => [
|
||||||
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
|
'link' => site_url('lehre/lehrauftrag/Lehrauftrag/Dashboard'),
|
||||||
'description' => 'Lehraufträge',
|
'description' => 'Lehrauftragsverwaltung',
|
||||||
#'icon' => 'person-chalkboard',
|
#'icon' => 'person-chalkboard',
|
||||||
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r')
|
'requiredPermissions' => array('lehre/lehrauftrag_bestellen:r', 'lehre/lehrauftrag_erteilen:r')
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -133,13 +133,21 @@ $config['students_tab_order'] = [
|
|||||||
|
|
||||||
$config['stv_prestudent_tags'] = [
|
$config['stv_prestudent_tags'] = [
|
||||||
'prioone' => ['readonly' => false],
|
'prioone' => ['readonly' => false],
|
||||||
'priotwo' => ['readonly' => true],
|
'priotwo' => ['readonly' => false],
|
||||||
'hinweis' => ['readonly' => false],
|
'hinweis' => ['readonly' => false],
|
||||||
'hinweis_assistenz' => ['readonly' => true],
|
'hinweis_assistenz' => ['readonly' => false],
|
||||||
'hinweis_kf' => ['readonly' => true],
|
'hinweis_kf' => ['readonly' => false],
|
||||||
'hinweis_lehrende' => ['readonly' => false],
|
'hinweis_lehrende' => ['readonly' => false],
|
||||||
'hinweis_stg_kf' => ['readonly' => true],
|
'hinweis_stg_kf' => ['readonly' => false],
|
||||||
'finished_stg' => ['readonly' => true],
|
'finished_stg' => ['readonly' => false],
|
||||||
'finished_kf' => ['readonly' => true],
|
'finished_kf' => ['readonly' => false],
|
||||||
'inwork_kf' => ['readonly' => true],
|
'inwork_kf' => ['readonly' => false],
|
||||||
|
'dd_auto' => ['readonly' => true],
|
||||||
|
'wh_auto' => ['readonly' => true],
|
||||||
|
'prewh_auto' => ['readonly' => true],
|
||||||
|
'out_auto' => ['readonly' => true],
|
||||||
|
'zgv_auto' => ['readonly' => true],
|
||||||
|
'unterbrecher_auto' => ['readonly' => true],
|
||||||
|
'stbtr_erh_auto' => ['readonly' => true],
|
||||||
|
'jgv_auto' => ['readonly' => true],
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -259,7 +259,7 @@ class BetriebsmittelP extends FHCAPI_Controller
|
|||||||
$kaution = $this->input->post('kaution');
|
$kaution = $this->input->post('kaution');
|
||||||
if($kaution) $kaution = str_replace(',', '.', $kaution);
|
if($kaution) $kaution = str_replace(',', '.', $kaution);
|
||||||
$ausgegebenam = $this->input->post('ausgegebenam');
|
$ausgegebenam = $this->input->post('ausgegebenam');
|
||||||
$retouram = $this->input->post('retouram') == "" ? null : $this->input->post('retouram');
|
$retouram = $this->input->post('retouram');
|
||||||
|
|
||||||
// NOTE(chris): transform_kartennummer
|
// NOTE(chris): transform_kartennummer
|
||||||
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer)
|
if ($betriebsmitteltyp == 'Zutrittskarte' && $nummer)
|
||||||
|
|||||||
@@ -9,9 +9,10 @@ class Detailheader extends FHCAPI_Controller
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getHeader' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r'],
|
'getHeader' => self::PERM_LOGGED,
|
||||||
'getPersonAbteilung' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r'],
|
'getPersonAbteilung' => self::PERM_LOGGED,
|
||||||
'getLeitungOrg' => ['vertrag/mitarbeiter:r', 'basis/mitarbeiter:r'],
|
'getLeitungOrg' => self::PERM_LOGGED,
|
||||||
|
'getSemesterStati' => self::PERM_LOGGED,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,6 +49,17 @@ class Detailheader extends FHCAPI_Controller
|
|||||||
$this->terminateWithSuccess(current($data));
|
$this->terminateWithSuccess(current($data));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getSemesterStati($prestudent_id)
|
||||||
|
{
|
||||||
|
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||||
|
|
||||||
|
$result = $this->PrestudentstatusModel->getAllPrestudentstatiWithStudiensemester($prestudent_id);
|
||||||
|
|
||||||
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($data);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -294,10 +294,6 @@ class Funktionen extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
}
|
}
|
||||||
if($datum_von == '')
|
|
||||||
$datum_von = null;
|
|
||||||
if($datum_bis == '')
|
|
||||||
$datum_bis = null;
|
|
||||||
|
|
||||||
$result = $this->BenutzerfunktionModel->update(
|
$result = $this->BenutzerfunktionModel->update(
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -246,12 +246,12 @@ class Abschlusspruefung extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
$searchString = $this->input->get('searchString') ?? '';
|
$searchString = $this->input->get('searchString') ?? '';
|
||||||
|
|
||||||
$this->load->model('ressource/Mitarbeiter_model', 'MitarbeiterModel');
|
$this->load->model('person/Person_model', 'PersonModel');
|
||||||
|
|
||||||
$result = $this->MitarbeiterModel->searchMitarbeiter($searchString, 'ohneMaUid');
|
$result = $this->PersonModel->searchPerson($searchString, 'mitMaUid');
|
||||||
|
|
||||||
if (isError($result)) {
|
if (isError($result)) {
|
||||||
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
$this->terminateWithError($result, self::ERROR_TYPE_GENERAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->terminateWithSuccess($result ?: []);
|
$this->terminateWithSuccess($result ?: []);
|
||||||
@@ -371,9 +371,6 @@ class Abschlusspruefung extends FHCAPI_Controller
|
|||||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
}
|
}
|
||||||
|
|
||||||
$datum = $formData['datum'] == '' ? null : $formData['datum'];
|
|
||||||
$sponsion = $formData['sponsion'] == '' ? null : $formData['sponsion'];
|
|
||||||
|
|
||||||
$result = $this->AbschlusspruefungModel->update(
|
$result = $this->AbschlusspruefungModel->update(
|
||||||
[
|
[
|
||||||
'abschlusspruefung_id' => $abschlusspruefung_id
|
'abschlusspruefung_id' => $abschlusspruefung_id
|
||||||
@@ -385,8 +382,8 @@ class Abschlusspruefung extends FHCAPI_Controller
|
|||||||
'vorsitz' => $vorsitz,
|
'vorsitz' => $vorsitz,
|
||||||
'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'],
|
'pruefungsantritt_kurzbz' => $formData['pruefungsantritt_kurzbz'],
|
||||||
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
|
'abschlussbeurteilung_kurzbz' => $formData['abschlussbeurteilung_kurzbz'],
|
||||||
'datum' => $datum,
|
'datum' => $formData['datum'],
|
||||||
'sponsion' => $sponsion,
|
'sponsion' => $formData['sponsion'],
|
||||||
'pruefer1' => $pruefer1,
|
'pruefer1' => $pruefer1,
|
||||||
'pruefer2' => $pruefer2,
|
'pruefer2' => $pruefer2,
|
||||||
'pruefer3' => $pruefer3,
|
'pruefer3' => $pruefer3,
|
||||||
|
|||||||
@@ -170,8 +170,6 @@ class Dokumente extends FHCAPI_Controller
|
|||||||
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
$this->terminateWithValidationErrors($this->form_validation->error_array());
|
||||||
}
|
}
|
||||||
|
|
||||||
$nachgereicht_am = $this->input->post('nachgereicht_am') == '' ? null : $this->input->post('nachgereicht_am');
|
|
||||||
|
|
||||||
$uid = getAuthUID();
|
$uid = getAuthUID();
|
||||||
|
|
||||||
$result = $this->AkteModel->update(
|
$result = $this->AkteModel->update(
|
||||||
@@ -182,7 +180,7 @@ class Dokumente extends FHCAPI_Controller
|
|||||||
'dokument_kurzbz' => $this->input->post('dokument_kurzbz'),
|
'dokument_kurzbz' => $this->input->post('dokument_kurzbz'),
|
||||||
'anmerkung_intern' => $this->input->post('anmerkung_intern'),
|
'anmerkung_intern' => $this->input->post('anmerkung_intern'),
|
||||||
'titel_intern' => $this->input->post('titel_intern'),
|
'titel_intern' => $this->input->post('titel_intern'),
|
||||||
'nachgereicht_am' => $nachgereicht_am,
|
'nachgereicht_am' => $this->input->post('nachgereicht_am'),
|
||||||
'updateamum' => date('c'),
|
'updateamum' => date('c'),
|
||||||
'updatevon' => $uid,
|
'updatevon' => $uid,
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -429,12 +429,9 @@ class Konto extends FHCAPI_Controller
|
|||||||
'updateamum' => date('c'),
|
'updateamum' => date('c'),
|
||||||
'updatevon' => getAuthUID()
|
'updatevon' => getAuthUID()
|
||||||
];
|
];
|
||||||
|
|
||||||
foreach ($allowed as $field)
|
foreach ($allowed as $field)
|
||||||
if ($this->input->post($field) !== null)
|
if ($this->input->post($field) !== null)
|
||||||
$data[$field] = $this->input->post($field);
|
$data[$field] = $this->input->post($field);
|
||||||
if($data['buchungsdatum'] == '')
|
|
||||||
$data['buchungsdatum'] = null;
|
|
||||||
|
|
||||||
$result = $this->KontoModel->update($id, $data);
|
$result = $this->KontoModel->update($id, $data);
|
||||||
|
|
||||||
|
|||||||
@@ -237,8 +237,8 @@ class Mobility extends FHCAPI_Controller
|
|||||||
}
|
}
|
||||||
$formData = $this->input->post('formData');
|
$formData = $this->input->post('formData');
|
||||||
|
|
||||||
$von = ($formData['von'] ?? '') ?: null;
|
$von = $formData['von'] ?? null;
|
||||||
$bis = ($formData['bis'] ?? '') ?: null;
|
$bis = $formData['bis'] ?? null;
|
||||||
$nation_code = $formData['nation_code'] ?? null;
|
$nation_code = $formData['nation_code'] ?? null;
|
||||||
$mobilitaetsprogramm_code = $formData['mobilitaetsprogramm_code'] ?? null;
|
$mobilitaetsprogramm_code = $formData['mobilitaetsprogramm_code'] ?? null;
|
||||||
$herkunftsland_code = $formData['herkunftsland_code'] ?? null;
|
$herkunftsland_code = $formData['herkunftsland_code'] ?? null;
|
||||||
|
|||||||
@@ -448,10 +448,8 @@ class Pruefung extends FHCAPI_Controller
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$datum = $this->input->post('datum') == '' ? null : $this->input->post('datum');
|
|
||||||
if(intval($pruefung_id) > 0)
|
if(intval($pruefung_id) > 0)
|
||||||
{
|
{
|
||||||
|
|
||||||
$result = $this->PruefungModel->update(
|
$result = $this->PruefungModel->update(
|
||||||
[
|
[
|
||||||
'pruefung_id' => $pruefung_id
|
'pruefung_id' => $pruefung_id
|
||||||
@@ -461,7 +459,7 @@ class Pruefung extends FHCAPI_Controller
|
|||||||
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
|
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
|
||||||
'note' => $this->input->post('note'),
|
'note' => $this->input->post('note'),
|
||||||
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
|
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
|
||||||
'datum' => $datum,
|
'datum' => $this->input->post('datum'),
|
||||||
'anmerkung' => $this->input->post('anmerkung'),
|
'anmerkung' => $this->input->post('anmerkung'),
|
||||||
'updatevon' => $authUID,
|
'updatevon' => $authUID,
|
||||||
'updateamum' => date('c'),
|
'updateamum' => date('c'),
|
||||||
@@ -474,7 +472,7 @@ class Pruefung extends FHCAPI_Controller
|
|||||||
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
|
'lehreinheit_id' => $this->input->post('lehreinheit_id'),
|
||||||
'student_uid' => $this->input->post('student_uid'),
|
'student_uid' => $this->input->post('student_uid'),
|
||||||
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
|
'mitarbeiter_uid' => $this->input->post('mitarbeiter_uid'),
|
||||||
'datum' => $datum,
|
'datum' => $this->input->post('datum'),
|
||||||
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
|
'pruefungstyp_kurzbz' => $this->input->post('pruefungstyp_kurzbz'),
|
||||||
'note' => $this->input->post('note'),
|
'note' => $this->input->post('note'),
|
||||||
'anmerkung' => $this->input->post('anmerkung'),
|
'anmerkung' => $this->input->post('anmerkung'),
|
||||||
@@ -522,7 +520,7 @@ class Pruefung extends FHCAPI_Controller
|
|||||||
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||||
'note' => $this->input->post('note'),
|
'note' => $this->input->post('note'),
|
||||||
'uebernahmedatum' => date('c'),
|
'uebernahmedatum' => date('c'),
|
||||||
'benotungsdatum' => $datum,
|
'benotungsdatum' => $this->input->post('datum'),
|
||||||
'insertamum' => date('c'),
|
'insertamum' => date('c'),
|
||||||
'insertvon' => $authUID,
|
'insertvon' => $authUID,
|
||||||
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
|
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
|
||||||
@@ -557,7 +555,7 @@ class Pruefung extends FHCAPI_Controller
|
|||||||
], [
|
], [
|
||||||
'note' => $this->input->post('note'),
|
'note' => $this->input->post('note'),
|
||||||
'uebernahmedatum' => date('c'),
|
'uebernahmedatum' => date('c'),
|
||||||
'benotungsdatum' => $datum,
|
'benotungsdatum' => $this->input->post('datum'),
|
||||||
'updateamum' => date('c'),
|
'updateamum' => date('c'),
|
||||||
'updatevon' => $authUID,
|
'updatevon' => $authUID,
|
||||||
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
|
'punkte' => $this->input->post('punkte') ? str_replace(',', '.', $this->input->post('punkte')) : null
|
||||||
|
|||||||
@@ -144,6 +144,7 @@ class Student extends FHCAPI_Controller
|
|||||||
. $this->PrestudentModel->escape($studiensemester_kurzbz)
|
. $this->PrestudentModel->escape($studiensemester_kurzbz)
|
||||||
. ") AS statusofsemester"
|
. ") AS statusofsemester"
|
||||||
);
|
);
|
||||||
|
$this->PrestudentModel->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
|
||||||
|
|
||||||
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
|
$this->PrestudentModel->addJoin('public.tbl_student s', 'prestudent_id', 'LEFT');
|
||||||
$this->PrestudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid', 'LEFT');
|
$this->PrestudentModel->addJoin('public.tbl_benutzer b', 'student_uid = uid', 'LEFT');
|
||||||
@@ -296,10 +297,6 @@ class Student extends FHCAPI_Controller
|
|||||||
$fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val);
|
$fotoval = ($val == '') ? null : str_replace('data:image/jpeg;base64,', '', $val);
|
||||||
$update_person[$prop] = $fotoval;
|
$update_person[$prop] = $fotoval;
|
||||||
}
|
}
|
||||||
else if ($prop == 'gebdatum')
|
|
||||||
{
|
|
||||||
$update_person[$prop] = ($val == '') ? null : $val;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
$update_person[$prop] = $val;
|
$update_person[$prop] = $val;
|
||||||
|
|||||||
@@ -138,7 +138,7 @@ class Students extends FHCAPI_Controller
|
|||||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->decodeTagsJsonInResult($data);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -197,7 +197,7 @@ class Students extends FHCAPI_Controller
|
|||||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->decodeTagsJsonInResult($data);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,7 +242,7 @@ class Students extends FHCAPI_Controller
|
|||||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->decodeTagsJsonInResult($data);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -439,13 +439,15 @@ class Students extends FHCAPI_Controller
|
|||||||
$this->studentlistlib->addSelect("'' AS verband");
|
$this->studentlistlib->addSelect("'' AS verband");
|
||||||
$this->studentlistlib->addSelect("'' AS gruppe");
|
$this->studentlistlib->addSelect("'' AS gruppe");
|
||||||
|
|
||||||
|
$query_studiensemester_kurzbz = $studiensemester_kurzbz ? $this->PrestudentModel->escape($studiensemester_kurzbz) : '\'NULL\'';
|
||||||
|
$this->studentlistlib->addSelect($query_studiensemester_kurzbz . ' as query_studiensemester_kurzbz');
|
||||||
|
|
||||||
$this->addFilter($studiensemester_kurzbz);
|
$this->addFilter($studiensemester_kurzbz);
|
||||||
|
|
||||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->decodeTagsJsonInResult($data);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -556,6 +558,7 @@ class Students extends FHCAPI_Controller
|
|||||||
$this->studentlistlib->addJoin("public.tbl_student s", "prestudent_id");
|
$this->studentlistlib->addJoin("public.tbl_student s", "prestudent_id");
|
||||||
|
|
||||||
$this->studentlistlib->addSelect("'' AS priorisierung_relativ");
|
$this->studentlistlib->addSelect("'' AS priorisierung_relativ");
|
||||||
|
$this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
|
||||||
|
|
||||||
if ($gruppe_kurzbz !== null) {
|
if ($gruppe_kurzbz !== null) {
|
||||||
$this->studentlistlib->addJoin('public.tbl_benutzergruppe g', 'uid', '', 'after_b');
|
$this->studentlistlib->addJoin('public.tbl_benutzergruppe g', 'uid', '', 'after_b');
|
||||||
@@ -594,10 +597,22 @@ class Students extends FHCAPI_Controller
|
|||||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->decodeTagsJsonInResult($data);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function decodeTagsJsonInResult(&$data)
|
||||||
|
{
|
||||||
|
if(defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) {
|
||||||
|
array_walk($data, function($item, $key) {
|
||||||
|
if(isset($item->tags))
|
||||||
|
{
|
||||||
|
$item->tags = json_decode($item->tags);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $prestudent_id
|
* @param string $prestudent_id
|
||||||
*
|
*
|
||||||
@@ -638,7 +653,7 @@ class Students extends FHCAPI_Controller
|
|||||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->decodeTagsJsonInResult($data);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -671,7 +686,7 @@ class Students extends FHCAPI_Controller
|
|||||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->decodeTagsJsonInResult($data);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -705,7 +720,7 @@ class Students extends FHCAPI_Controller
|
|||||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->decodeTagsJsonInResult($data);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -755,6 +770,7 @@ class Students extends FHCAPI_Controller
|
|||||||
END
|
END
|
||||||
) AS semester", false);
|
) AS semester", false);
|
||||||
|
|
||||||
|
$this->studentlistlib->addSelect($this->PrestudentModel->escape($studiensemester_kurzbz) . ' as query_studiensemester_kurzbz');
|
||||||
|
|
||||||
if ($prestudent_ids && $student_uids) {
|
if ($prestudent_ids && $student_uids) {
|
||||||
$this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_ids);
|
$this->studentlistlib->addWhere('tbl_prestudent.prestudent_id', $prestudent_ids);
|
||||||
@@ -773,7 +789,7 @@ class Students extends FHCAPI_Controller
|
|||||||
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
$result = $this->studentlistlib->execute($studiensemester_kurzbz);
|
||||||
|
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
|
$this->decodeTagsJsonInResult($data);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,7 +15,9 @@ class Tags extends Tag_Controller
|
|||||||
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
||||||
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
||||||
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
||||||
'deleteTag' => self::BERECHTIGUNG_KURZBZ
|
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
|
||||||
|
'getAllTags' => self::BERECHTIGUNG_KURZBZ,
|
||||||
|
'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$this->config->load('stv');
|
$this->config->load('stv');
|
||||||
@@ -45,4 +47,5 @@ class Tags extends Tag_Controller
|
|||||||
{
|
{
|
||||||
parent::doneTag($this->config->item('stv_prestudent_tags'));
|
parent::doneTag($this->config->item('stv_prestudent_tags'));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,117 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
if (!defined("BASEPATH")) exit("No direct script access allowed");
|
||||||
|
|
||||||
|
use \DateTime as DateTime;
|
||||||
|
|
||||||
|
class TagJob extends JOB_Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
const BATCHUSER = 'sftest';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* API constructor
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
|
||||||
|
// Configs
|
||||||
|
$this->load->config('stv');
|
||||||
|
|
||||||
|
// Library
|
||||||
|
$this->load->library('TagLib');
|
||||||
|
|
||||||
|
// Load Models
|
||||||
|
$this->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||||
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
|
||||||
|
|
||||||
|
$this->loadPhrases([
|
||||||
|
'lehre'
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rebuildAutomatedTags()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
$automatedTagsRes = $this->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
|
||||||
|
$automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
|
||||||
|
|
||||||
|
|
||||||
|
$result = $this->StudiensemesterModel->getAktOrNextSemester();
|
||||||
|
if (isError($result))
|
||||||
|
{
|
||||||
|
$this->logInfo('Start Job rebuild Automated Tags');
|
||||||
|
$this->logError('Error occurred during retrieving studiensemester');
|
||||||
|
return $this->logInfo('End Job rebuild Automated Tags');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (empty($result->retval) || !isset($result->retval[0])) {
|
||||||
|
$this->logInfo('Start Job rebuild Automated Tags');
|
||||||
|
$this->logError('No Studiensemester found');
|
||||||
|
return $this->logInfo('End Job rebuild Automated Tags');
|
||||||
|
}
|
||||||
|
$studiensemester_kurzbz = $result->retval[0]->studiensemester_kurzbz ?? null;
|
||||||
|
$params = array(
|
||||||
|
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->logInfo('Start Job rebuild Automated Tags ' . $studiensemester_kurzbz);
|
||||||
|
foreach($automatedTags as $autoTag)
|
||||||
|
{
|
||||||
|
// getPath: must not be lost
|
||||||
|
$filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/
|
||||||
|
|
||||||
|
if(file_exists($filePath)) {
|
||||||
|
require_once($filePath);
|
||||||
|
} else {
|
||||||
|
$this->logInfo("File not found: " . $filePath);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$kurz_bz = $autoTag->typ_kurzbz;
|
||||||
|
// className without PATH (basename)
|
||||||
|
$className = basename($autoTag->taglib);
|
||||||
|
|
||||||
|
$obj = new $className();
|
||||||
|
|
||||||
|
$outputArray = $obj->getZuordnungIds($params);
|
||||||
|
$typeId = $outputArray->typeId;
|
||||||
|
|
||||||
|
$paramsTag = array(
|
||||||
|
'studiensemester_kurzbz' => $studiensemester_kurzbz,
|
||||||
|
'kurzbz' => $kurz_bz,
|
||||||
|
'data' => $outputArray->data,
|
||||||
|
'typeId' => $typeId
|
||||||
|
);
|
||||||
|
|
||||||
|
$result = $this->taglib->updateAutomatedTags($paramsTag);
|
||||||
|
|
||||||
|
if (isError($result)) {
|
||||||
|
$this->logError('Error occurred during updateAutomatedTags ' . $kurz_bz);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = is_array($result) ? $result['retval'] : $result->retval;
|
||||||
|
|
||||||
|
//SUMMARY
|
||||||
|
$this->logInfo("Tag " . $result->retval['input']['tag'] . " | type_id " . $typeId . " --"
|
||||||
|
. " Count Recycled: " . $result->retval['summary']['recycled']
|
||||||
|
. " Count Added: ". $result->retval['summary']['added']
|
||||||
|
. " Count Deleted: ". $result->retval['summary']['deleted']);
|
||||||
|
|
||||||
|
//DETAILS
|
||||||
|
if($result->retval['results']['newTags'])
|
||||||
|
$this->logInfo("Tag " . $result->retval['input']['tag'] . "New tag(s): " . implode(', ', $result->retval['results']['newTags']));
|
||||||
|
if($result->retval['results']['deletedTagsIds'])
|
||||||
|
$this->logInfo("Tag " . $result->retval['input']['tag'] . "Deleted tags(s: " . implode(', ', $result->retval['results']['deletedTagsIds']));
|
||||||
|
if ($result->retval['results']['retaggedIds'])
|
||||||
|
$this->logInfo("Tag " . $result->retval['input']['tag'] . "Recycled tag(s): " . implode(', ', $result->retval['results']['retaggedIds']));
|
||||||
|
|
||||||
|
}
|
||||||
|
$this->logInfo( "End Job rebuild Automated Tags");
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -198,7 +198,19 @@ class Gradelist extends Auth_Controller
|
|||||||
if (!isset($row_noten->found))
|
if (!isset($row_noten->found))
|
||||||
{
|
{
|
||||||
$result_lv = $this->LehrveranstaltungModel->load($row_noten->lehrveranstaltung_id);
|
$result_lv = $this->LehrveranstaltungModel->load($row_noten->lehrveranstaltung_id);
|
||||||
$result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
|
|
||||||
|
$studiengang_kz = null;
|
||||||
|
|
||||||
|
if (!empty($result_lv->retval) && isset($result_lv->retval[0]) && isset($result_lv->retval[0]->studiengang_kz))
|
||||||
|
{
|
||||||
|
$result_stg = $this->StudiengangModel->load($result_lv->retval[0]->studiengang_kz);
|
||||||
|
|
||||||
|
if (!empty($result_stg->retval) && isset($result_stg->retval[0]) && is_object($result_stg->retval[0]) && isset($result_stg->retval[0]->kurzbzlang))
|
||||||
|
{
|
||||||
|
$studiengang_kz = $result_stg->retval[0]->kurzbzlang;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$courses['semester'][$row_noten->studiensemester_kurzbz]['lvs_nonstpl'][] = array(
|
$courses['semester'][$row_noten->studiensemester_kurzbz]['lvs_nonstpl'][] = array(
|
||||||
'lehrveranstaltung_id' => $row_noten->lehrveranstaltung_id,
|
'lehrveranstaltung_id' => $row_noten->lehrveranstaltung_id,
|
||||||
'lehrtyp_kurzbz' => $result_lv->retval[0]->lehrtyp_kurzbz,
|
'lehrtyp_kurzbz' => $result_lv->retval[0]->lehrtyp_kurzbz,
|
||||||
@@ -212,8 +224,8 @@ class Gradelist extends Auth_Controller
|
|||||||
'semester' => $result_lv->retval[0]->semester,
|
'semester' => $result_lv->retval[0]->semester,
|
||||||
'note' => $row_noten->note,
|
'note' => $row_noten->note,
|
||||||
'datum' => $row_noten->benotungsdatum,
|
'datum' => $row_noten->benotungsdatum,
|
||||||
'zugeordnet' => true,
|
'studiengang_kurzbz' => $studiengang_kz,
|
||||||
'studiengang_kurzbz' => $result_stg->retval[0]->kurzbzlang
|
'zugeordnet' => true
|
||||||
);
|
);
|
||||||
if(!isset($courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl']))
|
if(!isset($courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl']))
|
||||||
$courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl'] = 0;
|
$courses['semester'][$row_noten->studiensemester_kurzbz]['data']['ectssumme_nonstpl'] = 0;
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ class Tag_Controller extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
private $_uid;
|
private $_uid;
|
||||||
|
|
||||||
const BERECHTIGUNG_KURZBZ = 'admin:rw';
|
const BERECHTIGUNG_KURZBZ = ['admin:rw'];
|
||||||
|
|
||||||
public function __construct($permissions)
|
public function __construct($permissions)
|
||||||
{
|
{
|
||||||
@@ -15,10 +15,11 @@ class Tag_Controller extends FHCAPI_Controller
|
|||||||
'getTag' => self::BERECHTIGUNG_KURZBZ,
|
'getTag' => self::BERECHTIGUNG_KURZBZ,
|
||||||
'getTags' => self::BERECHTIGUNG_KURZBZ,
|
'getTags' => self::BERECHTIGUNG_KURZBZ,
|
||||||
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
'addTag' => self::BERECHTIGUNG_KURZBZ,
|
||||||
|
|
||||||
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
'updateTag' => self::BERECHTIGUNG_KURZBZ,
|
||||||
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
'doneTag' => self::BERECHTIGUNG_KURZBZ,
|
||||||
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
|
'deleteTag' => self::BERECHTIGUNG_KURZBZ,
|
||||||
|
'getAllTags' => self::BERECHTIGUNG_KURZBZ,
|
||||||
|
'rebuildTagsForTypeId' => self::BERECHTIGUNG_KURZBZ,
|
||||||
];
|
];
|
||||||
|
|
||||||
$merged_permissions = array_merge($default_permissions, $permissions);
|
$merged_permissions = array_merge($default_permissions, $permissions);
|
||||||
@@ -26,6 +27,10 @@ class Tag_Controller extends FHCAPI_Controller
|
|||||||
parent::__construct($merged_permissions);
|
parent::__construct($merged_permissions);
|
||||||
|
|
||||||
$this->_setAuthUID();
|
$this->_setAuthUID();
|
||||||
|
|
||||||
|
// Library
|
||||||
|
$this->load->library('TagLib');
|
||||||
|
|
||||||
$this->load->model('person/Notiz_model', 'NotizModel');
|
$this->load->model('person/Notiz_model', 'NotizModel');
|
||||||
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
|
$this->load->model('system/Notiztyp_model', 'NotiztypModel');
|
||||||
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
$this->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||||
@@ -37,7 +42,6 @@ class Tag_Controller extends FHCAPI_Controller
|
|||||||
|
|
||||||
public function getTag($readonly_tags = null)
|
public function getTag($readonly_tags = null)
|
||||||
{
|
{
|
||||||
$language = $this->_getLanguageIndex();
|
|
||||||
$id = $this->input->get('id');
|
$id = $this->input->get('id');
|
||||||
|
|
||||||
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
|
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
|
||||||
@@ -62,14 +66,17 @@ class Tag_Controller extends FHCAPI_Controller
|
|||||||
$this->NotizModel->addSelect(
|
$this->NotizModel->addSelect(
|
||||||
"tbl_notiz.titel,
|
"tbl_notiz.titel,
|
||||||
tbl_notiz.text,
|
tbl_notiz.text,
|
||||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>". $language. " as bezeichnung,
|
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
|
||||||
tbl_notiz.notiz_id,
|
tbl_notiz.notiz_id,
|
||||||
tbl_notiz_typ.style,
|
tbl_notiz_typ.style,
|
||||||
|
tbl_notiz_typ.automatisiert,
|
||||||
tbl_notiz.erledigt as done,
|
tbl_notiz.erledigt as done,
|
||||||
tbl_notiz.insertamum,
|
tbl_notiz.insertamum,
|
||||||
tbl_notiz.updateamum,
|
tbl_notiz.updateamum,
|
||||||
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
|
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
|
||||||
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter
|
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
|
||||||
|
tbl_notiz.start,
|
||||||
|
tbl_notiz.ende
|
||||||
"
|
"
|
||||||
);
|
);
|
||||||
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
|
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
|
||||||
@@ -82,18 +89,22 @@ class Tag_Controller extends FHCAPI_Controller
|
|||||||
|
|
||||||
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
|
$notiz = $this->NotizModel->loadWhere(array('notiz_id' => $id));
|
||||||
|
|
||||||
|
|
||||||
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
|
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz)[0] : array());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getTags($tags = null)
|
public function getTags($tags = null)
|
||||||
{
|
{
|
||||||
|
$language = $this->_getLanguageIndex();
|
||||||
|
|
||||||
$this->NotiztypModel->addSelect(
|
$this->NotiztypModel->addSelect(
|
||||||
'typ_kurzbz as tag_typ_kurzbz,
|
"typ_kurzbz as tag_typ_kurzbz,
|
||||||
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
|
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
|
||||||
style,
|
style,
|
||||||
beschreibung,
|
beschreibung,
|
||||||
tag
|
tag,
|
||||||
'
|
automatisiert
|
||||||
|
"
|
||||||
);
|
);
|
||||||
$this->NotiztypModel->addOrder('prioritaet');
|
$this->NotiztypModel->addOrder('prioritaet');
|
||||||
|
|
||||||
@@ -271,6 +282,74 @@ class Tag_Controller extends FHCAPI_Controller
|
|||||||
$this->terminateWithSuccess($deleteNotiz);
|
$this->terminateWithSuccess($deleteNotiz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getAllTags($readonly_tags = false){
|
||||||
|
$prestudent_id = $this->input->get('prestudent_id');
|
||||||
|
|
||||||
|
//TODO check for readonly: necessary?
|
||||||
|
if (is_array($readonly_tags) && !isEmptyArray($readonly_tags))
|
||||||
|
{
|
||||||
|
$readonly_tags = $this->_filterTag($readonly_tags, true);
|
||||||
|
|
||||||
|
foreach ($readonly_tags as $key => $tag)
|
||||||
|
{
|
||||||
|
$readonly_tags[$key] = $this->NotizModel->db->escape($tag);
|
||||||
|
}
|
||||||
|
$tags = '(' . implode(',', $readonly_tags) . ')';
|
||||||
|
|
||||||
|
$this->NotizModel->addSelect("
|
||||||
|
CASE
|
||||||
|
WHEN tbl_notiz_typ.typ_kurzbz IN $tags
|
||||||
|
THEN TRUE
|
||||||
|
ELSE FALSE
|
||||||
|
END as readonly
|
||||||
|
");
|
||||||
|
}
|
||||||
|
$this->NotizModel->addSelect(
|
||||||
|
"tbl_notiz.titel,
|
||||||
|
tbl_notiz.text,
|
||||||
|
array_to_json(bezeichnung_mehrsprachig::varchar[])->>0 as bezeichnung,
|
||||||
|
tbl_notiz.notiz_id,
|
||||||
|
tbl_notiz_typ.style,
|
||||||
|
tbl_notiz_typ.automatisiert,
|
||||||
|
tbl_notiz.erledigt as done,
|
||||||
|
tbl_notiz.insertamum,
|
||||||
|
tbl_notiz.updateamum,
|
||||||
|
(verfasserperson.vorname || ' ' || verfasserperson.nachname || ' ' || '(' || verfasserbenutzer.uid || ')') as verfasser,
|
||||||
|
(bearbeiterperson.vorname || ' ' || bearbeiterperson.nachname || ' ' || '(' || bearbeiterbenutzer.uid || ')') as bearbeiter,
|
||||||
|
tbl_notiz.start,
|
||||||
|
tbl_notiz.ende
|
||||||
|
"
|
||||||
|
);
|
||||||
|
$this->NotizModel->addJoin('public.tbl_notiz_typ', 'public.tbl_notiz.typ = public.tbl_notiz_typ.typ_kurzbz');
|
||||||
|
|
||||||
|
$this->NotizModel->addJoin('public.tbl_benutzer verfasserbenutzer', 'tbl_notiz.verfasser_uid = verfasserbenutzer.uid', 'LEFT');
|
||||||
|
$this->NotizModel->addJoin('public.tbl_person verfasserperson', 'verfasserbenutzer.person_id = verfasserperson.person_id', 'LEFT');
|
||||||
|
|
||||||
|
$this->NotizModel->addJoin('public.tbl_benutzer bearbeiterbenutzer', 'tbl_notiz.bearbeiter_uid = bearbeiterbenutzer.uid', 'LEFT');
|
||||||
|
$this->NotizModel->addJoin('public.tbl_person bearbeiterperson', 'bearbeiterbenutzer.person_id = bearbeiterperson.person_id', 'LEFT');
|
||||||
|
|
||||||
|
$this->NotizModel->addJoin('public.tbl_notizzuordnung notizzuordnung', 'tbl_notiz.notiz_id = notizzuordnung.notiz_id');
|
||||||
|
|
||||||
|
$notiz = $this->NotizModel->loadWhere(array('prestudent_id' => $prestudent_id));
|
||||||
|
|
||||||
|
|
||||||
|
$this->terminateWithSuccess(hasData($notiz) ? getData($notiz) : array());
|
||||||
|
}
|
||||||
|
|
||||||
|
public function rebuildTagsForTypeId()
|
||||||
|
{
|
||||||
|
$id = $this->input->post('id');
|
||||||
|
$typeId = $this->input->post('typeId');
|
||||||
|
$semester = $this->input->post('sem');
|
||||||
|
|
||||||
|
$result = $this->taglib->rebuildTagsForTypeId($typeId, $id, $semester);
|
||||||
|
|
||||||
|
if (isError($result))
|
||||||
|
return error ('Error occurred during updateAutomatedTags');
|
||||||
|
|
||||||
|
$this->terminateWithSuccess($result);
|
||||||
|
}
|
||||||
|
|
||||||
private function _setAuthUID()
|
private function _setAuthUID()
|
||||||
{
|
{
|
||||||
$this->_uid = getAuthUID();
|
$this->_uid = getAuthUID();
|
||||||
|
|||||||
@@ -270,6 +270,28 @@ function absoluteJsImportUrl($relurl)
|
|||||||
return $url;
|
return $url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Generate Css File Include if Extension contains file
|
||||||
|
*
|
||||||
|
* @param $relativeFilePath path relative to Extension public/css dir
|
||||||
|
*/
|
||||||
|
function generateCSSsIncludeIfExtensionCssExists($relativeFilePath)
|
||||||
|
{
|
||||||
|
$fsiterator = new FilesystemIterator(FHCPATH . 'application/extensions');
|
||||||
|
foreach ($fsiterator as $fsitem)
|
||||||
|
{
|
||||||
|
if(preg_match('/^FHC-Core-/', $fsitem->getBasename()))
|
||||||
|
{
|
||||||
|
$extensionfile = 'public/extensions/' . $fsitem->getBasename()
|
||||||
|
. '/css/' . $relativeFilePath;
|
||||||
|
if(is_readable(FHCPATH . $extensionfile))
|
||||||
|
{
|
||||||
|
generateCSSsInclude($extensionfile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Manipulate CI views includes Array to load
|
* Manipulate CI views includes Array to load
|
||||||
* - public/js/FhcApps.js via customJSs and
|
* - public/js/FhcApps.js via customJSs and
|
||||||
|
|||||||
@@ -0,0 +1,392 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* FH-Complete
|
||||||
|
*
|
||||||
|
* @package FHC-Helper
|
||||||
|
* @author FHC-Team
|
||||||
|
* @copyright Copyright (c) 2026 fhcomplete.net
|
||||||
|
* @license GPLv3
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (! defined('BASEPATH')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
use \DateTime as DateTime;
|
||||||
|
use \stdClass as stdClass;
|
||||||
|
|
||||||
|
class TagLib
|
||||||
|
{
|
||||||
|
const BATCHUSER = 'sftest';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object initialization
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->_ci =& get_instance();
|
||||||
|
|
||||||
|
// Configs
|
||||||
|
$this->_ci->load->config('stv');
|
||||||
|
|
||||||
|
// Models
|
||||||
|
$this->_ci->load->model('person/Notiz_model', 'NotizModel');
|
||||||
|
$this->_ci->load->model('system/Notiztyp_model', 'NotiztypModel');
|
||||||
|
$this->_ci->load->model('person/Notizzuordnung_model', 'NotizzuordnungModel');
|
||||||
|
$this->_ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||||
|
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
|
||||||
|
// Libraries
|
||||||
|
$this->_ci->load->library('PermissionLib');
|
||||||
|
$this->_ci->load->library('PrestudentLib');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateAutomatedTags($paramsTag)
|
||||||
|
{
|
||||||
|
// ---------------------------------
|
||||||
|
// check params
|
||||||
|
// ---------------------------------
|
||||||
|
$required = ['kurzbz', 'data', 'typeId'];
|
||||||
|
|
||||||
|
foreach ($required as $key) {
|
||||||
|
if (!isset($paramsTag[$key])) {
|
||||||
|
return error('Missing Parameter: ' . $key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$studiensemester_kurzbz = (isset ($paramsTag['studiensemester_kurzbz']) ? $paramsTag['studiensemester_kurzbz'] : null);
|
||||||
|
$tag = $paramsTag['kurzbz'];
|
||||||
|
$inputData = $paramsTag['data'];
|
||||||
|
$typeId = $paramsTag['typeId'];
|
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
// prepare input
|
||||||
|
// ---------------------------------
|
||||||
|
$zeitraum = [];
|
||||||
|
$arrayIds = [];
|
||||||
|
|
||||||
|
foreach ($inputData as $item) {
|
||||||
|
$id = $item['id'];
|
||||||
|
$arrayIds[] = $id;
|
||||||
|
|
||||||
|
$zeitraum[$id] = [
|
||||||
|
'von' => $item['von'] ?? null,
|
||||||
|
'bis' => $item['bis'] ?? null
|
||||||
|
];
|
||||||
|
}
|
||||||
|
$arrayIds = array_unique($arrayIds);
|
||||||
|
|
||||||
|
$result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
|
||||||
|
if (isError($result)) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
$data = $result->retval[0] ?? null;
|
||||||
|
|
||||||
|
$von = $data->start ?? null;
|
||||||
|
$bis = $data->ende ?? null;
|
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
// load existing tags
|
||||||
|
// ---------------------------------
|
||||||
|
$allTags = [];
|
||||||
|
$resultAllTags = $this->_ci->NotizModel->getAllTags($tag, $von, $bis);
|
||||||
|
if (isError($resultAllTags)) {
|
||||||
|
return $resultAllTags;
|
||||||
|
}
|
||||||
|
$allTagsData = getData($resultAllTags);
|
||||||
|
|
||||||
|
if (!empty($allTagsData)) {
|
||||||
|
foreach ($allTagsData as $item) {
|
||||||
|
$allTags[$item->$typeId] = $item->notiz_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
// map the data
|
||||||
|
// ---------------------------------
|
||||||
|
$toRecycle = [];
|
||||||
|
$toAdd = [];
|
||||||
|
$toDelete = [];
|
||||||
|
|
||||||
|
foreach ($arrayIds as $id) {
|
||||||
|
if (isset($allTags[$id])) {
|
||||||
|
$toRecycle[$id] = $allTags[$id];
|
||||||
|
} else {
|
||||||
|
$toAdd[] = $id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($allTags as $id => $notizId) {
|
||||||
|
if (!in_array($id, $arrayIds)) {
|
||||||
|
$toDelete[$id] = $notizId;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
// recycle (update existing)
|
||||||
|
// ---------------------------------
|
||||||
|
$countRecycled = 0;
|
||||||
|
$retagged = [];
|
||||||
|
|
||||||
|
foreach ($toRecycle as $id => $notizId)
|
||||||
|
{
|
||||||
|
$this->_updateTag($notizId, $zeitraum[$id]['von'], $zeitraum[$id]['bis']);
|
||||||
|
|
||||||
|
$countRecycled++;
|
||||||
|
$retagged[] = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
// ADD
|
||||||
|
// ---------------------------------
|
||||||
|
$countAdded = 0;
|
||||||
|
$tagged = [];
|
||||||
|
|
||||||
|
foreach ($toAdd as $id)
|
||||||
|
{
|
||||||
|
$this->_insertTag($typeId, $id, $tag, $zeitraum[$id]['von'], $zeitraum[$id]['bis']);
|
||||||
|
$countAdded++;
|
||||||
|
|
||||||
|
$tagged[] = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
// delete
|
||||||
|
// ---------------------------------
|
||||||
|
$countDeleted = 0;
|
||||||
|
$deleted = [];
|
||||||
|
|
||||||
|
foreach ($toDelete as $id => $notizId)
|
||||||
|
{
|
||||||
|
$result = $this->_deleteTag($notizId);
|
||||||
|
|
||||||
|
if (isError($result)) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
$countDeleted++;
|
||||||
|
$deleted[] = $id;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------
|
||||||
|
// return
|
||||||
|
// ---------------------------------
|
||||||
|
return success([
|
||||||
|
'input' => [
|
||||||
|
'tag' => $tag,
|
||||||
|
'arrayIds' => $arrayIds
|
||||||
|
],
|
||||||
|
'summary' => [
|
||||||
|
'recycled' => $countRecycled,
|
||||||
|
'added' => $countAdded,
|
||||||
|
'deleted' => $countDeleted
|
||||||
|
],
|
||||||
|
'details' => [
|
||||||
|
'existingTags' => $allTags,
|
||||||
|
'toAdd' => $toAdd,
|
||||||
|
'toRecycle' => $toRecycle,
|
||||||
|
'toDelete' => $toDelete
|
||||||
|
],
|
||||||
|
'results' => [
|
||||||
|
'retaggedIds' => $retagged,
|
||||||
|
'newTags' => $tagged,
|
||||||
|
'deletedTagsIds' => $deleted
|
||||||
|
]
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function updateAutomatedTagsForTypeId(array $params)
|
||||||
|
{
|
||||||
|
$return = null;
|
||||||
|
$notiz_id = null;
|
||||||
|
|
||||||
|
$von = $params['von'];
|
||||||
|
$bis = $params['bis'];
|
||||||
|
$tag = $params['kurzbz'];
|
||||||
|
$id = $params['id'];
|
||||||
|
$typeId = $params['typeId'];
|
||||||
|
|
||||||
|
$this->_ci->NotizModel->addSelect('nz.notiz_id');
|
||||||
|
$this->_ci->NotizModel->addSelect($typeId);
|
||||||
|
$this->_ci->NotizModel->addJoin('public.tbl_notizzuordnung nz', 'notiz_id');
|
||||||
|
$resultAllTags = $this->_ci->NotizModel->loadWhere([
|
||||||
|
'typ' => $tag,
|
||||||
|
$typeId => $id
|
||||||
|
]);
|
||||||
|
if(hasData($resultAllTags))
|
||||||
|
{
|
||||||
|
$notiz_id = $resultAllTags->retval[0]->notiz_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
//RECYCLE
|
||||||
|
if ($notiz_id !== null)
|
||||||
|
{
|
||||||
|
$resultUpdateNotiz = $this->_updateTag($notiz_id, $von, $bis);
|
||||||
|
$return = ['recycled' => $resultUpdateNotiz];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
//ADD
|
||||||
|
{
|
||||||
|
$resultInsertNotiz = $this->_insertTag($typeId, $id, $tag, $von, $bis);
|
||||||
|
$return = ['added' => $resultInsertNotiz];
|
||||||
|
}
|
||||||
|
return success($return);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* main function for rebuild Tags for typeId
|
||||||
|
* */
|
||||||
|
public function rebuildTagsForTypeId($typeId, $id, $studiensemester_kurzbz)
|
||||||
|
{
|
||||||
|
$automatedTagsRes = $this->_ci->NotiztypModel->loadWhere(array('automatisiert' => true, 'taglib IS NOT NULL' => null));
|
||||||
|
$automatedTags = hasData($automatedTagsRes) ? getData($automatedTagsRes) : [];
|
||||||
|
|
||||||
|
$result = $this->_ci->StudiensemesterModel->load($studiensemester_kurzbz);
|
||||||
|
if (isError($result))
|
||||||
|
return error('Error occurred during retrieving studiensemester');
|
||||||
|
if (empty($result->retval) || !isset($result->retval[0])) {
|
||||||
|
return error('No studiensemester found');
|
||||||
|
}
|
||||||
|
|
||||||
|
$startSem = $result->retval[0]->start ?? null;
|
||||||
|
$endeSem = $result->retval[0]->ende ?? null;
|
||||||
|
$return = [];
|
||||||
|
|
||||||
|
foreach ($automatedTags as $autoTag)
|
||||||
|
{
|
||||||
|
// getPath: must not be lost
|
||||||
|
$filePath = APPPATH . 'libraries/' . $autoTag->taglib . '.php'; // APPPATH = application/
|
||||||
|
|
||||||
|
if (file_exists($filePath)) {
|
||||||
|
require_once($filePath);
|
||||||
|
} else {
|
||||||
|
echo "File not found: " . $filePath;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$className = basename($autoTag->taglib);
|
||||||
|
$kurz_bz = $autoTag->typ_kurzbz;
|
||||||
|
|
||||||
|
$obj = new $className();
|
||||||
|
|
||||||
|
$criteriaIsSet = $obj->isCriteriaSetFor([
|
||||||
|
'typeId' => $typeId,
|
||||||
|
'id' => $id,
|
||||||
|
'studiensemester_kurzbz' => $studiensemester_kurzbz
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (hasData($criteriaIsSet))
|
||||||
|
{
|
||||||
|
$von = isset($criteriaIsSet->retval[0]->von) ? $criteriaIsSet->retval[0]->von : '';
|
||||||
|
$bis = isset($criteriaIsSet->retval[0]->bis) ? $criteriaIsSet->retval[0]->bis : '';
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
'von' => $von,
|
||||||
|
'bis' => $bis,
|
||||||
|
'kurzbz' => $autoTag->typ_kurzbz,
|
||||||
|
'typeId' => $typeId,
|
||||||
|
'id' => $id,
|
||||||
|
];
|
||||||
|
|
||||||
|
$result = $this->updateAutomatedTagsForTypeId($params);
|
||||||
|
if (isError($result))
|
||||||
|
return error('Error occurred during updateAutomatedTags' . $kurz_bz);
|
||||||
|
|
||||||
|
$return[$kurz_bz] = $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//CHECK FOR DELETE
|
||||||
|
$params = [
|
||||||
|
'von' => $startSem,
|
||||||
|
'bis' => $endeSem,
|
||||||
|
'kurzbz' => $autoTag->typ_kurzbz,
|
||||||
|
'typeId' => $typeId,
|
||||||
|
'id' => $id,
|
||||||
|
];
|
||||||
|
$result = $this->_ci->NotizModel->checkIfExistingTag($kurz_bz, $typeId, $id, $startSem, $endeSem);
|
||||||
|
if (hasData($result))
|
||||||
|
{
|
||||||
|
$notizId = $result->retval[0]->notiz_id;
|
||||||
|
$this->_deleteTag($notizId);
|
||||||
|
$return[$kurz_bz] = ['deleted' => $notizId];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return success($return);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _insertTag($typeId, $id, $tag, $von, $bis)
|
||||||
|
{
|
||||||
|
$resultInsert = $this->_ci->NotizModel->insert([
|
||||||
|
'titel' => 'TAG',
|
||||||
|
'text' => 'AUTOMATED TAG',
|
||||||
|
'verfasser_uid' => self::BATCHUSER,
|
||||||
|
'erledigt' => false,
|
||||||
|
'insertamum' => date('Y-m-d H:i:s'),
|
||||||
|
'insertvon' => 'BatchJobTagAdd',
|
||||||
|
'typ' => $tag,
|
||||||
|
'start' => $von,
|
||||||
|
'ende' => $bis
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (isError($resultInsert)) {
|
||||||
|
return error('Error inserting tag for ' . $typeId . ': ' . $id);
|
||||||
|
}
|
||||||
|
|
||||||
|
$notizId = $resultInsert->retval;
|
||||||
|
|
||||||
|
$resultZuordnung = $this->_ci->NotizzuordnungModel->insert([
|
||||||
|
'notiz_id' => $notizId,
|
||||||
|
$typeId => $id
|
||||||
|
]);
|
||||||
|
|
||||||
|
if (isError($resultZuordnung)) {
|
||||||
|
return error('Error inserting relation for ' . $typeId . ': ' . $id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $notizId;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _updateTag($notiz_id, $von, $bis)
|
||||||
|
{
|
||||||
|
$resultUpdateNotiz = $this->_ci->NotizModel->update(
|
||||||
|
[
|
||||||
|
'notiz_id' => $notiz_id
|
||||||
|
],
|
||||||
|
array(
|
||||||
|
'updateamum' => date('Y-m-d H:i:s'),
|
||||||
|
'updatevon' => 'BatchJobTagUpdate',
|
||||||
|
'start' => $von,
|
||||||
|
'ende' => $bis
|
||||||
|
));
|
||||||
|
|
||||||
|
|
||||||
|
if (isError($resultUpdateNotiz))
|
||||||
|
return error ('Error occurred during Update ' . $notiz_id);
|
||||||
|
|
||||||
|
return $notiz_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function _deleteTag($notiz_id)
|
||||||
|
{
|
||||||
|
$result = $this->_ci->NotizzuordnungModel->delete([
|
||||||
|
'notiz_id' => $notiz_id
|
||||||
|
]);
|
||||||
|
if (isError($result)) {
|
||||||
|
return error('Error occurred during delete Notizzuordnung ' . $notiz_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = $this->_ci->NotizModel->delete([
|
||||||
|
'notiz_id' => $notiz_id
|
||||||
|
]);
|
||||||
|
if (isError($result)) {
|
||||||
|
return error('Error occurred during delete Notiz ' . $notiz_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return success([
|
||||||
|
'deleted' => $notiz_id
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -47,8 +47,6 @@ class StudentListLib
|
|||||||
|
|
||||||
// Add default SELECTs
|
// Add default SELECTs
|
||||||
$this->addSelect("b.uid");
|
$this->addSelect("b.uid");
|
||||||
if (defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED)
|
|
||||||
$this->addSelect('tag_data_agg.tags');
|
|
||||||
$this->addSelect('titelpre');
|
$this->addSelect('titelpre');
|
||||||
$this->addSelect('nachname');
|
$this->addSelect('nachname');
|
||||||
$this->addSelect('vorname');
|
$this->addSelect('vorname');
|
||||||
@@ -72,6 +70,13 @@ class StudentListLib
|
|||||||
$this->addSelect('pls.status_kurzbz AS status');
|
$this->addSelect('pls.status_kurzbz AS status');
|
||||||
$this->addSelect('pls.datum AS status_datum');
|
$this->addSelect('pls.datum AS status_datum');
|
||||||
$this->addSelect('pls.bestaetigtam AS status_bestaetigung');
|
$this->addSelect('pls.bestaetigtam AS status_bestaetigung');
|
||||||
|
$this->addSelect("
|
||||||
|
CASE
|
||||||
|
WHEN pls.status_kurzbz IN ('Interessent','Aufgenommener','Bewerber','Wartender')
|
||||||
|
THEN pls.ausbildungssemester
|
||||||
|
ELSE s.semester
|
||||||
|
END AS semester_berechnet
|
||||||
|
");
|
||||||
$this->addSelect(
|
$this->addSelect(
|
||||||
"(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung LIMIT 1) AS mail_privat",
|
"(SELECT kontakt FROM public.tbl_kontakt WHERE kontakttyp='email' AND person_id=p.person_id AND zustellung LIMIT 1) AS mail_privat",
|
||||||
false
|
false
|
||||||
@@ -129,41 +134,6 @@ class StudentListLib
|
|||||||
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT');
|
$this->addJoin('public.tbl_benutzer b', 's.student_uid=b.uid', 'LEFT');
|
||||||
$this->addJoin("v", "", ""); // Will be replaced later
|
$this->addJoin("v", "", ""); // Will be replaced later
|
||||||
$this->addJoin("ps", "", ""); // Will be replaced later
|
$this->addJoin("ps", "", ""); // Will be replaced later
|
||||||
if (defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) {
|
|
||||||
$this->_ci->load->config('stv');
|
|
||||||
$tags = $this->_ci->config->item('stv_prestudent_tags');
|
|
||||||
|
|
||||||
$whereTags = '';
|
|
||||||
if (is_array($tags) && !isEmptyArray($tags)) {
|
|
||||||
$tags = array_keys($tags);
|
|
||||||
|
|
||||||
foreach ($tags as $key => $tag) {
|
|
||||||
$tags[$key] = $this->_ci->PrestudentModel->escape($tag);
|
|
||||||
}
|
|
||||||
$whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
|
|
||||||
}
|
|
||||||
$subQueryTag = "(
|
|
||||||
SELECT
|
|
||||||
tag.prestudent_id,
|
|
||||||
COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
|
|
||||||
FROM (
|
|
||||||
SELECT DISTINCT ON (n.notiz_id)
|
|
||||||
n.notiz_id AS id,
|
|
||||||
nt.typ_kurzbz,
|
|
||||||
array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
|
|
||||||
n.text AS notiz,
|
|
||||||
nt.style,
|
|
||||||
n.erledigt AS done,
|
|
||||||
nz.prestudent_id
|
|
||||||
FROM public.tbl_notizzuordnung AS nz
|
|
||||||
JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id
|
|
||||||
JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " . $whereTags . "
|
|
||||||
) AS tag
|
|
||||||
GROUP BY tag.prestudent_id
|
|
||||||
) AS tag_data_agg";
|
|
||||||
|
|
||||||
$this->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -283,8 +253,9 @@ class StudentListLib
|
|||||||
*/
|
*/
|
||||||
public function execute($studiensemester_kurzbz)
|
public function execute($studiensemester_kurzbz)
|
||||||
{
|
{
|
||||||
$stdsemEsc = $studiensemester_kurzbz ? $this->_ci->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
|
$this->addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz);
|
||||||
|
|
||||||
|
$stdsemEsc = $studiensemester_kurzbz ? $this->_ci->PrestudentModel->escape($studiensemester_kurzbz) : 'NULL';
|
||||||
|
|
||||||
$this->addSelect(
|
$this->addSelect(
|
||||||
"public.get_rolle_prestudent(
|
"public.get_rolle_prestudent(
|
||||||
@@ -325,6 +296,72 @@ class StudentListLib
|
|||||||
//------------------------------------------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------------------------------------------
|
||||||
// Protected methods
|
// Protected methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add Select and Join for Tags if configured
|
||||||
|
*
|
||||||
|
* @param string studiensemester_kurzbz
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
protected function addSelectAndJoinForTagsIfConfigured($studiensemester_kurzbz)
|
||||||
|
{
|
||||||
|
if (defined('STV_TAGS_ENABLED') && STV_TAGS_ENABLED) {
|
||||||
|
$this->_ci->load->config('stv');
|
||||||
|
$tags = $this->_ci->config->item('stv_prestudent_tags');
|
||||||
|
|
||||||
|
$whereTags = '';
|
||||||
|
if (is_array($tags) && !isEmptyArray($tags)) {
|
||||||
|
$tags = array_keys($tags);
|
||||||
|
|
||||||
|
foreach ($tags as $key => $tag) {
|
||||||
|
$tags[$key] = $this->_ci->PrestudentModel->escape($tag);
|
||||||
|
}
|
||||||
|
$whereTags = " AND nt.typ_kurzbz IN (" . implode(",", $tags) . ")";
|
||||||
|
}
|
||||||
|
$studiensemester_kurzbz_escaped = $this->_ci->PrestudentModel->escape($studiensemester_kurzbz);
|
||||||
|
$subQueryTag = "(
|
||||||
|
SELECT
|
||||||
|
tag.prestudent_id,
|
||||||
|
COALESCE(json_agg(tag ORDER BY tag.done), '[]'::json) AS tags
|
||||||
|
FROM (
|
||||||
|
SELECT DISTINCT ON (n.notiz_id)
|
||||||
|
n.notiz_id AS id,
|
||||||
|
nt.typ_kurzbz,
|
||||||
|
array_to_json(nt.bezeichnung_mehrsprachig)->>0 AS beschreibung,
|
||||||
|
n.text AS notiz,
|
||||||
|
nt.style,
|
||||||
|
n.erledigt AS done,
|
||||||
|
nz.prestudent_id,
|
||||||
|
n.start,
|
||||||
|
n.ende
|
||||||
|
FROM public.tbl_notizzuordnung AS nz
|
||||||
|
JOIN public.tbl_notiz AS n ON nz.notiz_id = n.notiz_id AND nz.prestudent_id IS NOT NULL
|
||||||
|
JOIN public.tbl_notiz_typ AS nt ON n.typ = nt.typ_kurzbz " . $whereTags . "
|
||||||
|
WHERE
|
||||||
|
COALESCE(n.start, '1970-01-01') <= (
|
||||||
|
SELECT
|
||||||
|
ende
|
||||||
|
FROM
|
||||||
|
public.tbl_studiensemester
|
||||||
|
WHERE
|
||||||
|
studiensemester_kurzbz = " . $studiensemester_kurzbz_escaped . "
|
||||||
|
)
|
||||||
|
AND COALESCE(n.ende, '2170-12-31') >= (
|
||||||
|
SELECT
|
||||||
|
start
|
||||||
|
FROM
|
||||||
|
public.tbl_studiensemester
|
||||||
|
WHERE
|
||||||
|
studiensemester_kurzbz = " . $studiensemester_kurzbz_escaped . "
|
||||||
|
)
|
||||||
|
) AS tag
|
||||||
|
GROUP BY tag.prestudent_id
|
||||||
|
) AS tag_data_agg";
|
||||||
|
|
||||||
|
$this->addSelect('tag_data_agg.tags');
|
||||||
|
$this->addJoin($subQueryTag, 'tag_data_agg.prestudent_id = tbl_prestudent.prestudent_id', 'LEFT');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get alias of a table or select statement
|
* Get alias of a table or select statement
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Description of dd_auto
|
||||||
|
*
|
||||||
|
* @author ma0068
|
||||||
|
*/
|
||||||
|
class CoreDoubleDegreeTagLib
|
||||||
|
{
|
||||||
|
protected $ci;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->ci = get_instance();
|
||||||
|
$this->ci->load->model('codex/Mobilitaet_model', 'MobilitaetModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZuordnungIds(array $params)
|
||||||
|
{
|
||||||
|
if(!isset($params['studiensemester_kurzbz']))
|
||||||
|
{
|
||||||
|
return (object) array(
|
||||||
|
'idArray' => []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
|
|
||||||
|
$this->ci->MobilitaetModel->addJoin('bis.tbl_gsprogramm', 'gsprogramm_id');
|
||||||
|
$this->ci->MobilitaetModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
|
||||||
|
$result = $this->ci->MobilitaetModel-> loadWhere(array(
|
||||||
|
'gsprogrammtyp_kurzbz' => 'Double',
|
||||||
|
'studiensemester_kurzbz' => $semester
|
||||||
|
));
|
||||||
|
$data = $result->retval;
|
||||||
|
|
||||||
|
$doubledegree_data = array_map(function($item) {
|
||||||
|
return [
|
||||||
|
'id' => $item->prestudent_id,
|
||||||
|
'von' => $item->start,
|
||||||
|
'bis' => $item->ende
|
||||||
|
];
|
||||||
|
}, $data);
|
||||||
|
|
||||||
|
return (object) array(
|
||||||
|
'data' => $doubledegree_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->MobilitaetModel->addSelect('prestudent_id');
|
||||||
|
$this->ci->MobilitaetModel->addSelect('start as von');
|
||||||
|
$this->ci->MobilitaetModel->addSelect('ende as bis');
|
||||||
|
|
||||||
|
$this->ci->MobilitaetModel->addJoin('bis.tbl_gsprogramm', 'gsprogramm_id');
|
||||||
|
$this->ci->MobilitaetModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
|
||||||
|
$result = $this->ci->MobilitaetModel->loadWhere(array(
|
||||||
|
'gsprogrammtyp_kurzbz' => 'Double',
|
||||||
|
'studiensemester_kurzbz' => $semester,
|
||||||
|
'prestudent_id' => $prestudent_id
|
||||||
|
));
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
//array mit prestudent_id, von und bis
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Description unruly
|
||||||
|
* Test for different typeId
|
||||||
|
*
|
||||||
|
* @author ma0068
|
||||||
|
*/
|
||||||
|
class CoreFiftyFiveTagLib
|
||||||
|
{
|
||||||
|
protected $ci;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->ci = get_instance();
|
||||||
|
$this->ci->load->model('person/Person_model', 'PersonModel');
|
||||||
|
$this->ci-> load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZuordnungIds(array $params)
|
||||||
|
{
|
||||||
|
if(!isset($params['studiensemester_kurzbz']))
|
||||||
|
{
|
||||||
|
return (object) array(
|
||||||
|
'person_id' => []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
|
|
||||||
|
$result = $this->ci->StudiensemesterModel->loadWhere(array(
|
||||||
|
'studiensemester_kurzbz' => $semester
|
||||||
|
));
|
||||||
|
$data = $result->retval[0];
|
||||||
|
|
||||||
|
$semVon = $data->start;
|
||||||
|
$semBis = $data->ende;
|
||||||
|
$result = $this->ci->PersonModel->getFiftyFivers($semVon, $semBis);
|
||||||
|
|
||||||
|
$data = $result->retval;
|
||||||
|
$fiftyFiveData = array_map(function($item) {
|
||||||
|
return [
|
||||||
|
'id' => $item->person_id
|
||||||
|
];
|
||||||
|
}, $data);
|
||||||
|
|
||||||
|
return (object) array(
|
||||||
|
'data' => $fiftyFiveData,
|
||||||
|
'typeId' => 'person_id'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isCriteriaSetFor(array $params)
|
||||||
|
{
|
||||||
|
if ( !isset($params['id'], $params['studiensemester_kurzbz'], $params['typeId']) || $params['typeId'] !== 'person_id')
|
||||||
|
return false;
|
||||||
|
|
||||||
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
|
$person_id = $params['id'];
|
||||||
|
$typeId = $params['typeId'];
|
||||||
|
|
||||||
|
|
||||||
|
$result = $this->ci->StudiensemesterModel->loadWhere(array(
|
||||||
|
'studiensemester_kurzbz' => $semester
|
||||||
|
));
|
||||||
|
$data = $result->retval[0];
|
||||||
|
|
||||||
|
$semVon = $data->start;
|
||||||
|
$semBis = $data->ende;
|
||||||
|
$result = $this->ci->PersonModel->isFiftyFive($semVon, $semBis, $person_id);
|
||||||
|
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Description of jgv_auto (Jahrgangsvertretung)
|
||||||
|
*
|
||||||
|
* @author ma0068
|
||||||
|
*/
|
||||||
|
class CoreJgvTagLib
|
||||||
|
{
|
||||||
|
protected $ci;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->ci = get_instance();
|
||||||
|
$this->ci->load->model('person/Benutzerfunktion_model', 'BenutzerfunktionModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZuordnungIds(array $params)
|
||||||
|
{
|
||||||
|
if(!isset($params['studiensemester_kurzbz']))
|
||||||
|
{
|
||||||
|
return (object) array(
|
||||||
|
'idArray' => []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
|
|
||||||
|
$result = $this->ci->BenutzerfunktionModel->getPrestudentsOfJgv($semester);
|
||||||
|
|
||||||
|
$data = $result->retval;
|
||||||
|
|
||||||
|
$jgv_data = array_map(function($item) {
|
||||||
|
return [
|
||||||
|
'id' => $item->prestudent_id,
|
||||||
|
'von' => $item->datum_von,
|
||||||
|
'bis' => $item->datum_bis
|
||||||
|
];
|
||||||
|
}, $data);
|
||||||
|
|
||||||
|
return (object) array(
|
||||||
|
'data' => $jgv_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->BenutzerfunktionModel->isJgv($semester, $prestudent_id);
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Description of zgv_auto
|
||||||
|
*
|
||||||
|
* @author ma0068
|
||||||
|
*/
|
||||||
|
class CoreMissingZgvTagLib
|
||||||
|
{
|
||||||
|
protected $ci;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->ci = get_instance();
|
||||||
|
$this->ci->load->model('crm/Prestudent_model', 'PrestudentModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZuordnungIds(array $params)
|
||||||
|
{
|
||||||
|
if(!isset($params['studiensemester_kurzbz']))
|
||||||
|
{
|
||||||
|
return (object) array(
|
||||||
|
'idArray' => []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
|
|
||||||
|
$this->ci->PrestudentModel->addJoin('public.tbl_prestudentstatus', 'prestudent_id');
|
||||||
|
$this->ci->PrestudentModel->addJoin('public.tbl_benutzer bn', 'person_id');
|
||||||
|
$this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
||||||
|
$result = $this->ci->PrestudentModel-> loadWhere(array(
|
||||||
|
'bn.aktiv' => true, //check if necessary
|
||||||
|
'zgvdatum' => null,
|
||||||
|
'typ' => 'b',
|
||||||
|
'studiensemester_kurzbz' => $semester
|
||||||
|
));
|
||||||
|
|
||||||
|
$data = $result->retval;
|
||||||
|
|
||||||
|
$zgvmissing_data = array_map(function($item) {
|
||||||
|
return [
|
||||||
|
'id' => $item->prestudent_id,
|
||||||
|
'von' => null,
|
||||||
|
'bis' => null
|
||||||
|
];
|
||||||
|
}, $data);
|
||||||
|
|
||||||
|
return (object) array(
|
||||||
|
'typeId' => 'prestudent_id',
|
||||||
|
'data' => $zgvmissing_data
|
||||||
|
);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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->PrestudentModel->addJoin('public.tbl_prestudentstatus', 'prestudent_id');
|
||||||
|
$this->ci->PrestudentModel->addJoin('public.tbl_benutzer bn', 'person_id');
|
||||||
|
$this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
||||||
|
$result = $this->ci->PrestudentModel->loadWhere(array(
|
||||||
|
'bn.aktiv' => true, //check if necessary
|
||||||
|
'zgvdatum' => null,
|
||||||
|
'typ' => 'b',
|
||||||
|
'studiensemester_kurzbz' => $semester,
|
||||||
|
'prestudent_id' => $prestudent_id
|
||||||
|
));
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Description of out_auto
|
||||||
|
*
|
||||||
|
* @author ma0068
|
||||||
|
*/
|
||||||
|
class CoreOutgoingTagLib
|
||||||
|
{
|
||||||
|
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->getOutgoingsOfSemester($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->isPrestudentOutgoing($semester, $prestudent_id);
|
||||||
|
|
||||||
|
if (hasData($result)) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Description of prewh_auto
|
||||||
|
*
|
||||||
|
* @author bambi
|
||||||
|
*/
|
||||||
|
class CorePrewiederholerTagLib
|
||||||
|
{
|
||||||
|
protected $ci;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->ci = get_instance();
|
||||||
|
$this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZuordnungIds(array $params)
|
||||||
|
{
|
||||||
|
if(!isset($params['studiensemester_kurzbz']))
|
||||||
|
{
|
||||||
|
return (object) array(
|
||||||
|
'idArray' => []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
|
|
||||||
|
$this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
$result = $this->ci->PrestudentstatusModel-> loadWhere(array(
|
||||||
|
'statusgrund_id' => 15,
|
||||||
|
'studiensemester_kurzbz' => $semester
|
||||||
|
));
|
||||||
|
$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->PrestudentstatusModel->addSelect('prestudent_id');
|
||||||
|
$this->ci->PrestudentstatusModel->addSelect('start as von');
|
||||||
|
$this->ci->PrestudentstatusModel->addSelect('ende as bis');
|
||||||
|
|
||||||
|
$this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
|
||||||
|
$result = $this->ci->PrestudentstatusModel->loadWhere(array(
|
||||||
|
'statusgrund_id' => 15,
|
||||||
|
'studiensemester_kurzbz' => $semester,
|
||||||
|
'prestudent_id' => $prestudent_id
|
||||||
|
));
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Description of dd_auto
|
||||||
|
*
|
||||||
|
* @author ma0068
|
||||||
|
*/
|
||||||
|
class CoreStbErhoehtTagLib
|
||||||
|
{
|
||||||
|
protected $ci;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->ci = get_instance();
|
||||||
|
$this->ci->load->model('crm/Konto_model', 'KontoModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZuordnungIds(array $params)
|
||||||
|
{
|
||||||
|
if(!isset($params['studiensemester_kurzbz']))
|
||||||
|
{
|
||||||
|
return (object) array(
|
||||||
|
'idArray' => []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
|
|
||||||
|
$this->ci->KontoModel->addJoin('public.tbl_prestudent', 'person_id');
|
||||||
|
$this->ci->KontoModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
|
||||||
|
$result = $this->ci->KontoModel-> loadWhere(array(
|
||||||
|
'buchungstyp_kurzbz' => 'StudiengebuehrErhoeht',
|
||||||
|
'studiensemester_kurzbz' => $semester
|
||||||
|
));
|
||||||
|
$data = $result->retval;
|
||||||
|
|
||||||
|
$konto_data = array_map(function($item) {
|
||||||
|
return [
|
||||||
|
'id' => $item->prestudent_id,
|
||||||
|
'von' => $item->start,
|
||||||
|
'bis' => $item->ende
|
||||||
|
];
|
||||||
|
}, $data);
|
||||||
|
|
||||||
|
return (object) array(
|
||||||
|
'data' => $konto_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->KontoModel->addSelect('prestudent_id');
|
||||||
|
$this->ci->KontoModel->addSelect('start as von');
|
||||||
|
$this->ci->KontoModel->addSelect('ende as bis');
|
||||||
|
$this->ci->KontoModel->addJoin('public.tbl_prestudent', 'person_id');
|
||||||
|
$this->ci->KontoModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
|
||||||
|
$result = $this->ci->KontoModel-> loadWhere(array(
|
||||||
|
'buchungstyp_kurzbz' => 'StudiengebuehrErhoeht',
|
||||||
|
'studiensemester_kurzbz' => $semester,
|
||||||
|
'prestudent_id' => $prestudent_id
|
||||||
|
));
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Description of wiedereinstieg_auto
|
||||||
|
*
|
||||||
|
* @author ma0068
|
||||||
|
*/
|
||||||
|
class CoreUnterbrecherTagLib
|
||||||
|
{
|
||||||
|
protected $ci;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->ci = get_instance();
|
||||||
|
$this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZuordnungIds(array $params)
|
||||||
|
{
|
||||||
|
if(!isset($params['studiensemester_kurzbz']))
|
||||||
|
{
|
||||||
|
return (object) array(
|
||||||
|
'idArray' => []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
|
$this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
|
||||||
|
$result = $this->ci->PrestudentstatusModel-> loadWhere(array(
|
||||||
|
'status_kurzbz' => 'Unterbrecher',
|
||||||
|
'studiensemester_kurzbz' => $semester
|
||||||
|
));
|
||||||
|
$data = $result->retval;
|
||||||
|
|
||||||
|
$unterbrecher_data = array_map(function($item) {
|
||||||
|
return [
|
||||||
|
'id' => $item->prestudent_id,
|
||||||
|
'von' => $item->start,
|
||||||
|
'bis' => $item->ende
|
||||||
|
];
|
||||||
|
}, $data);
|
||||||
|
|
||||||
|
return (object) array(
|
||||||
|
'data' => $unterbrecher_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->PrestudentstatusModel->addSelect('prestudent_id');
|
||||||
|
$this->ci->PrestudentstatusModel->addSelect('start as von');
|
||||||
|
$this->ci->PrestudentstatusModel->addSelect('ende as bis');
|
||||||
|
|
||||||
|
$this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
$result = $this->ci->PrestudentstatusModel-> loadWhere(array(
|
||||||
|
'status_kurzbz' => 'Unterbrecher',
|
||||||
|
'studiensemester_kurzbz' => $semester,
|
||||||
|
'prestudent_id' => $prestudent_id
|
||||||
|
));
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Description of wh_auto
|
||||||
|
*
|
||||||
|
* @author bambi
|
||||||
|
*/
|
||||||
|
class CoreWiederholerTagLib
|
||||||
|
{
|
||||||
|
protected $ci;
|
||||||
|
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->ci = get_instance();
|
||||||
|
$this->ci->load->model('crm/Prestudentstatus_model', 'PrestudentstatusModel');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getZuordnungIds(array $params)
|
||||||
|
{
|
||||||
|
if(!isset($params['studiensemester_kurzbz']))
|
||||||
|
{
|
||||||
|
return (object) array(
|
||||||
|
'idArray' => []
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
|
|
||||||
|
$this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
$result = $this->ci->PrestudentstatusModel-> loadWhere(array(
|
||||||
|
'statusgrund_id' => 16,
|
||||||
|
'studiensemester_kurzbz' => $semester
|
||||||
|
));
|
||||||
|
$data = $result->retval;
|
||||||
|
|
||||||
|
$wiederholer_data = array_map(function($item) {
|
||||||
|
return [
|
||||||
|
'id' => $item->prestudent_id,
|
||||||
|
'von' => $item->start,
|
||||||
|
'bis' => $item->ende
|
||||||
|
];
|
||||||
|
}, $data);
|
||||||
|
|
||||||
|
return (object) array(
|
||||||
|
'typeId' => 'prestudent_id',
|
||||||
|
'data' => $wiederholer_data
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
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->PrestudentstatusModel->addSelect('prestudent_id');
|
||||||
|
$this->ci->PrestudentstatusModel->addSelect('start as von');
|
||||||
|
$this->ci->PrestudentstatusModel->addSelect('ende as bis');
|
||||||
|
|
||||||
|
$this->ci->PrestudentstatusModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
|
||||||
|
$result = $this->ci->PrestudentstatusModel->loadWhere(array(
|
||||||
|
'statusgrund_id' => 16,
|
||||||
|
'studiensemester_kurzbz' => $semester,
|
||||||
|
'prestudent_id' => $prestudent_id,
|
||||||
|
));
|
||||||
|
|
||||||
|
if(hasData($result))
|
||||||
|
{
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -44,4 +44,57 @@ class Bisio_model extends DB_Model
|
|||||||
else
|
else
|
||||||
return success("Bisio not found");
|
return success("Bisio not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets outgoing students of certain Semester
|
||||||
|
* @param String studiensemester_kurzbz
|
||||||
|
* @return array of prestudent_ids
|
||||||
|
*/
|
||||||
|
public function getOutgoingsOfSemester($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 = "
|
||||||
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -348,5 +348,64 @@ class Benutzerfunktion_model extends DB_Model
|
|||||||
return success($funktionJson);
|
return success($funktionJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets all Prestudents with details for a given Benutzerfunktion and optionally semester
|
||||||
|
*
|
||||||
|
* @param String $studiensemester_kurzbz
|
||||||
|
* @return object |null
|
||||||
|
*/
|
||||||
|
public function getPrestudentsOfJgv($semester)
|
||||||
|
{
|
||||||
|
$query = "
|
||||||
|
SELECT DISTINCT ps.prestudent_id, bf.datum_von, bf.datum_bis
|
||||||
|
FROM public.tbl_benutzerfunktion bf
|
||||||
|
JOIN public.tbl_benutzer bn USING (uid)
|
||||||
|
JOIN public.tbl_prestudent ps USING (person_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 bf.funktion_kurzbz = 'jgv'
|
||||||
|
AND (
|
||||||
|
bf.datum_von <= ss.ende
|
||||||
|
AND (
|
||||||
|
bf.datum_bis >= ss.start
|
||||||
|
OR bf.datum_bis IS NULL
|
||||||
|
)
|
||||||
|
)
|
||||||
|
";
|
||||||
|
|
||||||
|
return $this->execQuery($query, array($semester));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a certain prestudent has the Benutzerfunktion jgv for a certain semester
|
||||||
|
*
|
||||||
|
* @param String $studiensemester_kurzbz
|
||||||
|
* @param $prestudent_id
|
||||||
|
* @return object |null
|
||||||
|
*/
|
||||||
|
public function isJgv($semester, $prestudent_id)
|
||||||
|
{
|
||||||
|
$query = "
|
||||||
|
SELECT ps.prestudent_id, ss.start as von, ss.ende as bis
|
||||||
|
FROM public.tbl_benutzerfunktion bf
|
||||||
|
JOIN public.tbl_benutzer bn USING (uid)
|
||||||
|
JOIN public.tbl_prestudent ps USING (person_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 bf.funktion_kurzbz = 'jgv'
|
||||||
|
AND (
|
||||||
|
bf.datum_von <= ss.ende
|
||||||
|
AND (
|
||||||
|
bf.datum_bis >= ss.start
|
||||||
|
OR bf.datum_bis IS NULL
|
||||||
|
)
|
||||||
|
)
|
||||||
|
AND ps.prestudent_id = ?
|
||||||
|
";
|
||||||
|
|
||||||
|
return $this->execQuery($query, array($semester, $prestudent_id));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -296,4 +296,59 @@ class Notiz_model extends DB_Model
|
|||||||
|
|
||||||
return $this->loadWhere(array('anrechnung_id' => $anrechnung_id));
|
return $this->loadWhere(array('anrechnung_id' => $anrechnung_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* check if a given Tag for a certain notizzuordnung id is valid
|
||||||
|
*
|
||||||
|
* @param $tag typ_kurzbz to check
|
||||||
|
* @param $typeId typeId to check
|
||||||
|
* @param $id id to check
|
||||||
|
* @param $von start of time period or NULL
|
||||||
|
* @param $bis end of time period or NULL
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function checkIfExistingTag($tag, $typeId, $id, $von=null, $bis=null)
|
||||||
|
{
|
||||||
|
$query = "
|
||||||
|
SELECT *
|
||||||
|
FROM public.tbl_notiz
|
||||||
|
JOIN public.tbl_notizzuordnung nz USING (notiz_id)
|
||||||
|
WHERE typ = ?
|
||||||
|
AND {$typeId} = ?
|
||||||
|
AND (
|
||||||
|
start IS NULL
|
||||||
|
OR ende IS NULL
|
||||||
|
OR (start <= ? AND ende >= ?)
|
||||||
|
)
|
||||||
|
";
|
||||||
|
|
||||||
|
return $this->execQuery($query, [$tag, $id, $bis, $von]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns all existing tags of a certain tag within a time period
|
||||||
|
*
|
||||||
|
* @param $tag typ_kurzbz of tag
|
||||||
|
* @param $von start of time period or NULL
|
||||||
|
* @param $bis end of time period or NULL
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function getAllTags($tag, $von=null, $bis=null)
|
||||||
|
{
|
||||||
|
$query = "
|
||||||
|
SELECT *
|
||||||
|
FROM public.tbl_notiz
|
||||||
|
JOIN public.tbl_notizzuordnung nz USING (notiz_id)
|
||||||
|
WHERE typ = ?
|
||||||
|
AND (
|
||||||
|
start IS NULL
|
||||||
|
OR ende IS NULL
|
||||||
|
OR (start <= ? AND ende >= ?)
|
||||||
|
);
|
||||||
|
";
|
||||||
|
|
||||||
|
return $this->execQuery($query, array($tag, $bis, $von));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,7 +149,7 @@ class Person_model extends DB_Model
|
|||||||
* @param $filter Term to search for.
|
* @param $filter Term to search for.
|
||||||
* @return DB-result
|
* @return DB-result
|
||||||
*/
|
*/
|
||||||
public function searchPerson($filter)
|
public function searchPerson($filter, $mode=null)
|
||||||
{
|
{
|
||||||
$this->addSelect('vorname, nachname, gebdatum, person_id, titelpre, titelpost');
|
$this->addSelect('vorname, nachname, gebdatum, person_id, titelpre, titelpost');
|
||||||
$this->addSelect("CASE
|
$this->addSelect("CASE
|
||||||
@@ -161,6 +161,26 @@ class Person_model extends DB_Model
|
|||||||
THEN 'Student'
|
THEN 'Student'
|
||||||
ELSE 'Person'
|
ELSE 'Person'
|
||||||
END AS status");
|
END AS status");
|
||||||
|
|
||||||
|
if($mode == 'mitMaUid')
|
||||||
|
{
|
||||||
|
$this->addSelect("(
|
||||||
|
SELECT m.mitarbeiter_uid
|
||||||
|
FROM public.tbl_benutzer b
|
||||||
|
JOIN public.tbl_mitarbeiter m
|
||||||
|
ON b.uid = m.mitarbeiter_uid
|
||||||
|
WHERE b.person_id = tbl_person.person_id
|
||||||
|
LIMIT 1
|
||||||
|
)
|
||||||
|
AS uid");
|
||||||
|
$this->addOrder('uid, lower(nachname), lower(vorname)');
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$this->addOrder('lower(nachname), lower(vorname)');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
$result = $this->loadWhere(
|
$result = $this->loadWhere(
|
||||||
'lower(nachname) like '.$this->db->escape('%'.mb_strtolower($filter).'%')."
|
'lower(nachname) like '.$this->db->escape('%'.mb_strtolower($filter).'%')."
|
||||||
OR lower(vorname) like ".$this->db->escape('%'.$filter.'%')."
|
OR lower(vorname) like ".$this->db->escape('%'.$filter.'%')."
|
||||||
@@ -433,4 +453,33 @@ class Person_model extends DB_Model
|
|||||||
|
|
||||||
return $this->execReadOnlyQuery($qry, [$person_id]);
|
return $this->execReadOnlyQuery($qry, [$person_id]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//just a test function for a person_id tag
|
||||||
|
//alle personen die innerhalb dieses Zeitraumens 55 werden
|
||||||
|
public function getFiftyFivers($von, $bis)
|
||||||
|
{
|
||||||
|
$qry = "
|
||||||
|
SELECT
|
||||||
|
p.person_id
|
||||||
|
FROM public.tbl_person p
|
||||||
|
WHERE p.gebdatum >= DATE ? - INTERVAL '55 years'
|
||||||
|
AND p.gebdatum <= DATE ? - INTERVAL '55 years';
|
||||||
|
";
|
||||||
|
return $this->execReadOnlyQuery($qry, [$von, $bis]);
|
||||||
|
}
|
||||||
|
|
||||||
|
//just a test function for a person_id tag
|
||||||
|
//check if Person gets 55 in this time
|
||||||
|
public function isFiftyFive($von, $bis, $person_id)
|
||||||
|
{
|
||||||
|
$qry = "
|
||||||
|
SELECT
|
||||||
|
p.person_id
|
||||||
|
FROM public.tbl_person p
|
||||||
|
WHERE p.gebdatum >= DATE ? - INTERVAL '55 years'
|
||||||
|
AND p.gebdatum <= DATE ? - INTERVAL '55 years'
|
||||||
|
AND p.persond_id = ?;
|
||||||
|
";
|
||||||
|
return $this->execReadOnlyQuery($qry, [$von, $bis, $person_id]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,7 +132,11 @@
|
|||||||
if ($cis === true) generateCSSsInclude(defined('CIS4') ? 'public/css/cis4.css' : 'public/css/cis_bs5.css');
|
if ($cis === true) generateCSSsInclude(defined('CIS4') ? 'public/css/cis4.css' : 'public/css/cis_bs5.css');
|
||||||
|
|
||||||
//Tags
|
//Tags
|
||||||
if ($tags === true) generateCSSsInclude('public/css/tags.css');
|
if ($tags === true)
|
||||||
|
{
|
||||||
|
generateCSSsInclude('public/css/tags.css');
|
||||||
|
generateCSSsIncludeIfExtensionCssExists('tags.css');
|
||||||
|
}
|
||||||
|
|
||||||
$extapphelper = ExtendableAppsHelper::getInstance();
|
$extapphelper = ExtendableAppsHelper::getInstance();
|
||||||
$extapphelper->init($customCSSs, $customJSs, $customJSModules);
|
$extapphelper->init($customCSSs, $customJSs, $customJSModules);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
@import './SvgIcons.css';
|
@import './SvgIcons.css';
|
||||||
@import './components/searchbar/searchbar.css';
|
@import './components/searchbar/searchbar.css';
|
||||||
@import './components/verticalsplit.css';
|
@import './components/verticalsplit.css';
|
||||||
|
@import './components/horizontalsplit.css';
|
||||||
@import './components/FilterComponent.css';
|
@import './components/FilterComponent.css';
|
||||||
@import './components/Tabs.css';
|
@import './components/Tabs.css';
|
||||||
@import './components/Notiz.css';
|
@import './components/Notiz.css';
|
||||||
@@ -95,6 +96,13 @@ html.fs_huge {
|
|||||||
overflow: visible !important;
|
overflow: visible !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* to enable scrolling for many student entries*/
|
||||||
|
.stv-details-abschlusspruefung-student-names {
|
||||||
|
max-height: 80px;
|
||||||
|
overflow-y: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
.p-dropdown-item{
|
.p-dropdown-item{
|
||||||
z-index: 1201 !important;
|
z-index: 1201 !important;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,75 @@
|
|||||||
|
:root {
|
||||||
|
--fhc-horizontalsplit-hsplitter-bg-color: var(--fhc-background, #eee);
|
||||||
|
--fhc-horizontalsplit-hsplitter-border-color: var(--fhc-border, #eee);
|
||||||
|
--fhc-horizontalsplit-hsplitter-splitactions-color: var(--fhc-dark, #000);
|
||||||
|
}
|
||||||
|
|
||||||
|
.horizontalsplit-container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
overflow: hidden;
|
||||||
|
max-height: 100%;
|
||||||
|
padding: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.horizontalsplitted {
|
||||||
|
overflow: auto;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.horizontalsplitter {
|
||||||
|
flex-shrink: 0;
|
||||||
|
width: 16px;
|
||||||
|
cursor: col-resize;
|
||||||
|
user-select: none;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.horizontalsplitter.left {
|
||||||
|
border-left: solid 3px var(--fhc-horizontalsplit-hsplitter-border-color);
|
||||||
|
margin-right: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.horizontalsplitter.right {
|
||||||
|
border-right: solid 3px var(--fhc-horizontalsplit-hsplitter-border-color);
|
||||||
|
margin-left: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitactions.horizontal {
|
||||||
|
background-color: var(--fhc-horizontalsplit-hsplitter-bg-color);
|
||||||
|
color: var(--fhc-horizontalsplit-hsplitter-splitactions-color);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
padding: 5px 0 5px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitactions.horizontal.left {
|
||||||
|
border-radius: 0 40% 40% 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitactions.horizontal.right {
|
||||||
|
border-radius: 40% 0 0 40%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitactions.horizontal .splitaction {
|
||||||
|
width: 14px;
|
||||||
|
height: 28px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.splitactions.horizontal .splitaction.resize {
|
||||||
|
cursor: col-resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content {
|
||||||
|
padding-top: 0 !important;
|
||||||
|
padding-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#content > div:first-child {
|
||||||
|
margin-top: 30px;
|
||||||
|
}
|
||||||
+26
-2
@@ -46,7 +46,6 @@
|
|||||||
background-color: #ffA500ff;
|
background-color: #ffA500ff;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.tag_braun {
|
.tag_braun {
|
||||||
background-color: #6d4c41;
|
background-color: #6d4c41;
|
||||||
}
|
}
|
||||||
@@ -69,12 +68,37 @@
|
|||||||
|
|
||||||
.tag_limette {
|
.tag_limette {
|
||||||
background-color: #D3FFCE;
|
background-color: #D3FFCE;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag_turquoise {
|
||||||
|
background-color: #89cccf;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag_bordeaux {
|
||||||
|
background-color: #7B1B38;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag_olive {
|
||||||
|
background-color: #868d07;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tag_beige {
|
||||||
|
background-color: #E4D5B4;
|
||||||
|
color: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tag_done {
|
.tag_done {
|
||||||
text-decoration: line-through;
|
text-decoration: line-through;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tag_auto {
|
||||||
|
border: 1px dashed white;
|
||||||
|
}
|
||||||
|
|
||||||
.display_all {
|
.display_all {
|
||||||
background-color: darkgrey !important;
|
background-color: darkgrey !important;
|
||||||
border: none;
|
border: none;
|
||||||
@@ -111,4 +135,4 @@
|
|||||||
.copy-btn {
|
.copy-btn {
|
||||||
float: right;
|
float: right;
|
||||||
margin-top: 3px;
|
margin-top: 3px;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,4 +34,10 @@ export default {
|
|||||||
url: 'api/frontend/v1/detailheader/detailheader/getLeitungOrg/' + oekurzbz,
|
url: 'api/frontend/v1/detailheader/detailheader/getLeitungOrg/' + oekurzbz,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
getSemesterStati(prestudent_id){
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: 'api/frontend/v1/detailheader/detailheader/getSemesterStati/' + prestudent_id,
|
||||||
|
};
|
||||||
|
},
|
||||||
}
|
}
|
||||||
@@ -51,4 +51,20 @@ export default {
|
|||||||
params: data
|
params: data
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getAllTagsPrestudent(prestudent_id){
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: 'api/frontend/v1/stv/Tags/getAllTags',
|
||||||
|
params: prestudent_id
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
rebuildTagsforTypeId(data){
|
||||||
|
return {
|
||||||
|
method: 'post',
|
||||||
|
url: 'api/frontend/v1/stv/Tags/rebuildTagsForTypeId/',
|
||||||
|
params: data
|
||||||
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
@@ -35,9 +35,6 @@ export default {
|
|||||||
getMitarbeiter(searchString){
|
getMitarbeiter(searchString){
|
||||||
return this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/' + searchString);
|
return this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getMitarbeiter/' + searchString);
|
||||||
},
|
},
|
||||||
getPruefer(searchString){
|
|
||||||
return this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getPruefer/' + searchString);
|
|
||||||
},
|
|
||||||
getNoten(){
|
getNoten(){
|
||||||
return this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getNoten/');
|
return this.$fhcApi.get('api/frontend/v1/stv/abschlusspruefung/getNoten/');
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -433,7 +433,6 @@ export default {
|
|||||||
:label="$p.t('wawi/ausgegebenam')"
|
:label="$p.t('wawi/ausgegebenam')"
|
||||||
name="ausgegebenam"
|
name="ausgegebenam"
|
||||||
v-model="formData.ausgegebenam"
|
v-model="formData.ausgegebenam"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
auto-apply
|
auto-apply
|
||||||
:enable-time-picker="false"
|
:enable-time-picker="false"
|
||||||
text-input
|
text-input
|
||||||
@@ -450,7 +449,6 @@ export default {
|
|||||||
:label="$p.t('wawi/retouram')"
|
:label="$p.t('wawi/retouram')"
|
||||||
name="retouram"
|
name="retouram"
|
||||||
v-model="formData.retouram"
|
v-model="formData.retouram"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
auto-apply
|
auto-apply
|
||||||
:enable-time-picker="false"
|
:enable-time-picker="false"
|
||||||
text-input
|
text-input
|
||||||
|
|||||||
@@ -1,11 +1,17 @@
|
|||||||
import ApiDetailHeader from "../../api/factory/detailHeader.js";
|
import ApiDetailHeader from "../../api/factory/detailHeader.js";
|
||||||
import ApiHandleFoto from "../../api/factory/fotoHandling.js";
|
import ApiHandleFoto from "../../api/factory/fotoHandling.js";
|
||||||
import ModalUploadFoto from "./Modal/UploadFoto.js";
|
import ModalUploadFoto from "./Modal/UploadFoto.js";
|
||||||
|
import PvSkeleton from "../../../../index.ci.php/public/js/components/primevue/skeleton/skeleton.esm.min.js";
|
||||||
|
import CoreTag from "../Tag/Tag.js";
|
||||||
|
import ApiTag from "../../api/factory/stv/tag.js";
|
||||||
|
import { idTagFormatter } from "../Tag/tagFormatter.js";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DetailHeader',
|
name: 'DetailHeader',
|
||||||
components: {
|
components: {
|
||||||
ModalUploadFoto
|
ModalUploadFoto,
|
||||||
|
PvSkeleton,
|
||||||
|
CoreTag
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
headerData: {
|
headerData: {
|
||||||
@@ -38,8 +44,26 @@ export default {
|
|||||||
'mitarbeiter',
|
'mitarbeiter',
|
||||||
].includes(value)
|
].includes(value)
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
currentSemester: {
|
||||||
|
type: String,
|
||||||
|
default: ''
|
||||||
|
},
|
||||||
|
isLoading: { //if true, then parent isLoading
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
inject: {
|
||||||
|
tagsEnabled: {
|
||||||
|
from: 'configStvTagsEnabled',
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
lists: {
|
||||||
|
from: 'lists',
|
||||||
|
required: true
|
||||||
|
},
|
||||||
|
},
|
||||||
computed: {
|
computed: {
|
||||||
appRoot() {
|
appRoot() {
|
||||||
return FHC_JS_DATA_STORAGE_OBJECT.app_root;
|
return FHC_JS_DATA_STORAGE_OBJECT.app_root;
|
||||||
@@ -61,17 +85,30 @@ export default {
|
|||||||
hasTileUIDSlot() {
|
hasTileUIDSlot() {
|
||||||
return !!this.$slots.uid
|
return !!this.$slots.uid
|
||||||
},
|
},
|
||||||
|
prestudentIds() {
|
||||||
|
if (this.headerData[0].prestudent_id)
|
||||||
|
{
|
||||||
|
return [this.headerData[0].prestudent_id];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
semesterDates(){
|
||||||
|
return this.lists.studiensemester?.find(item => item.studiensemester_kurzbz === this.currentSemester) || {};
|
||||||
|
}
|
||||||
},
|
},
|
||||||
created(){
|
created(){
|
||||||
if (this.typeHeader === 'student') {
|
if (this.typeHeader === 'student') {
|
||||||
if (!this.headerData) {
|
if (!this.headerData) {
|
||||||
throw new Error('[DetailHeader] "headerData" is required.')
|
throw new Error('[DetailHeader] "headerData" is required.')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(this.tagsEnabled) {
|
||||||
|
this.loadTagsAndRender(this.headerData[0].prestudent_id);
|
||||||
|
}
|
||||||
|
|
||||||
} else if (this.typeHeader === 'mitarbeiter') {
|
} else if (this.typeHeader === 'mitarbeiter') {
|
||||||
if (!this.person_id || !this.mitarbeiter_uid || !this.domain) {
|
if (!this.person_id || !this.mitarbeiter_uid || !this.domain) {
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'[DetailHeader] "person_id", "mitarbeiter_uid", and "domain" are requried.'
|
'[DetailHeader] "person_id", "mitarbeiter_uid", and "domain" are required.'
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
this.loadHeaderData(this.person_id, this.mitarbeiter_uid);
|
this.loadHeaderData(this.person_id, this.mitarbeiter_uid);
|
||||||
@@ -86,13 +123,34 @@ export default {
|
|||||||
},
|
},
|
||||||
deep: true,
|
deep: true,
|
||||||
},
|
},
|
||||||
|
headerData: {
|
||||||
|
handler(newVal) {
|
||||||
|
if (this.typeHeader === 'student' && newVal?.length) {
|
||||||
|
this.getSemesterStati(newVal[0].prestudent_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(this.tagsEnabled) {
|
||||||
|
this.loadTagsAndRender(this.headerData[0].prestudent_id);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep: true,
|
||||||
|
immediate: true
|
||||||
|
},
|
||||||
},
|
},
|
||||||
data(){
|
data(){
|
||||||
return{
|
return{
|
||||||
headerDataMa: {},
|
headerDataMa: {},
|
||||||
departmentData: {},
|
departmentData: {},
|
||||||
leitungData: {},
|
leitungData: {},
|
||||||
isFetchingIssues: false
|
isFetchingIssues: false,
|
||||||
|
noCurrentStatus: false,
|
||||||
|
semesterStatiLoading: false,
|
||||||
|
leitungOrgLoading: false,
|
||||||
|
departmentDataLoading: false,
|
||||||
|
headerDataMaLoading: false,
|
||||||
|
tagEndpoint: ApiTag,
|
||||||
|
tagData: null,
|
||||||
|
rebuildData: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -108,29 +166,40 @@ export default {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
getHeader(person_id) {
|
getHeader(person_id) {
|
||||||
|
this.headerDataMaLoading = true;
|
||||||
return this.$api
|
return this.$api
|
||||||
.call(ApiDetailHeader.getHeader(person_id))
|
.call(ApiDetailHeader.getHeader(person_id))
|
||||||
.then(result => {
|
.then(result => {
|
||||||
this.headerDataMa = result.data;
|
this.headerDataMa = result.data;
|
||||||
|
|
||||||
})
|
})
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
.catch(this.$fhcAlert.handleSystemError)
|
||||||
|
.finally(() => {
|
||||||
|
this.headerDataMaLoading = false;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
loadDepartmentData(mitarbeiter_uid) {
|
loadDepartmentData(mitarbeiter_uid) {
|
||||||
|
this.departmentDataLoading = true;
|
||||||
return this.$api
|
return this.$api
|
||||||
.call(ApiDetailHeader.getPersonAbteilung(mitarbeiter_uid))
|
.call(ApiDetailHeader.getPersonAbteilung(mitarbeiter_uid))
|
||||||
.then(result => {
|
.then(result => {
|
||||||
this.departmentData = result.data;
|
this.departmentData = result.data;
|
||||||
})
|
})
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
.catch(this.$fhcAlert.handleSystemError)
|
||||||
|
.finally(() => {
|
||||||
|
this.departmentDataLoading = false;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
getLeitungOrg(oekurzbz){
|
getLeitungOrg(oekurzbz){
|
||||||
|
this.leitungOrgLoading = true;
|
||||||
return this.$api
|
return this.$api
|
||||||
.call(ApiDetailHeader.getLeitungOrg(oekurzbz))
|
.call(ApiDetailHeader.getLeitungOrg(oekurzbz))
|
||||||
.then(result => {
|
.then(result => {
|
||||||
this.leitungData = result.data;
|
this.leitungData = result.data;
|
||||||
})
|
})
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
.catch(this.$fhcAlert.handleSystemError)
|
||||||
|
.finally(() => {
|
||||||
|
this.leitungOrgLoading = false;
|
||||||
|
});
|
||||||
},
|
},
|
||||||
async goToLeitung() {
|
async goToLeitung() {
|
||||||
this.loadHeaderData(this.leitungData.person_id, this.leitungData.uid);
|
this.loadHeaderData(this.leitungData.person_id, this.leitungData.uid);
|
||||||
@@ -179,7 +248,88 @@ export default {
|
|||||||
} else {
|
} else {
|
||||||
return 'data:image/jpeg;base64,' + foto;
|
return 'data:image/jpeg;base64,' + foto;
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
getSemesterStati(prestudent_id){
|
||||||
|
this.semesterStatiLoading = true;
|
||||||
|
this.$api
|
||||||
|
.call(ApiDetailHeader.getSemesterStati(prestudent_id))
|
||||||
|
.then(result => {
|
||||||
|
this.semesterStati = result.data;
|
||||||
|
this.setNoCurrentStatus();
|
||||||
|
})
|
||||||
|
.catch(this.$fhcAlert.handleSystemError)
|
||||||
|
.finally(() => {
|
||||||
|
this.semesterStatiLoading = false;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
setNoCurrentStatus() {
|
||||||
|
if(!Array.isArray(this.semesterStati))
|
||||||
|
{
|
||||||
|
this.noCurrentStatus = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!this.semesterStati.some(item => item.studiensemester_kurzbz === this.currentSemester)) {
|
||||||
|
this.noCurrentStatus = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
this.noCurrentStatus = false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//methods tags
|
||||||
|
async loadTagsAndRender(prestudent_id) {
|
||||||
|
await this.getAllTags(prestudent_id);
|
||||||
|
|
||||||
|
const container = idTagFormatter(
|
||||||
|
prestudent_id,
|
||||||
|
this.tagData,
|
||||||
|
this.$refs.tagComponent,
|
||||||
|
'prestudent_id',
|
||||||
|
this.semesterDates.start,
|
||||||
|
this.semesterDates.ende
|
||||||
|
);
|
||||||
|
|
||||||
|
if(this.headerData.length == 1) {
|
||||||
|
this.$refs.tagWrapper.innerHTML = '';
|
||||||
|
this.$refs.tagWrapper.appendChild(container);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
getAllTags(prestudent_id){
|
||||||
|
return this.$api
|
||||||
|
.call(ApiTag.getAllTagsPrestudent({prestudent_id}))
|
||||||
|
.then(result => {
|
||||||
|
this.tagData = result.data;
|
||||||
|
})
|
||||||
|
.catch(this.$fhcAlert.handleSystemError);
|
||||||
|
},
|
||||||
|
addedTag(addedTag)
|
||||||
|
{
|
||||||
|
this.reload();
|
||||||
|
},
|
||||||
|
deletedTag(id)
|
||||||
|
{
|
||||||
|
this.reload();
|
||||||
|
},
|
||||||
|
updatedTag(updatedTag)
|
||||||
|
{
|
||||||
|
this.reload();
|
||||||
|
},
|
||||||
|
rebuildPrestudentTags(){
|
||||||
|
const params = {
|
||||||
|
id : this.headerData[0].prestudent_id,
|
||||||
|
typeId: 'prestudent_id',
|
||||||
|
sem: this.currentSemester
|
||||||
|
};
|
||||||
|
|
||||||
|
return this.$api
|
||||||
|
.call(ApiTag.rebuildTagsforTypeId(params))
|
||||||
|
.then(result => {
|
||||||
|
this.rebuildData = result.data;
|
||||||
|
console.log("Rebuild manually triggered");
|
||||||
|
this.reload();
|
||||||
|
})
|
||||||
|
.catch(this.$fhcAlert.handleSystemError);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
<div class="core-header d-flex justify-content-start align-items-center w-100 overflow-auto pb-2 gap-3" style="max-height:9rem; min-width: 37.5rem;">
|
<div class="core-header d-flex justify-content-start align-items-center w-100 overflow-auto pb-2 gap-3" style="max-height:9rem; min-width: 37.5rem;">
|
||||||
@@ -200,7 +350,6 @@ export default {
|
|||||||
</modal-upload-foto>
|
</modal-upload-foto>
|
||||||
|
|
||||||
<template v-if="typeHeader==='student'">
|
<template v-if="typeHeader==='student'">
|
||||||
|
|
||||||
<div
|
<div
|
||||||
v-for="person in headerData"
|
v-for="person in headerData"
|
||||||
:key="person.person_id"
|
:key="person.person_id"
|
||||||
@@ -236,62 +385,133 @@ export default {
|
|||||||
<small class="text-muted">{{person.uid}}</small>
|
<small class="text-muted">{{person.uid}}</small>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div v-if="headerData.length == 1">
|
<div v-if="headerData.length == 1">
|
||||||
<div class="d-flex align-items-center gap-3">
|
<div v-if="!isLoading" class="d-flex align-items-center gap-3">
|
||||||
<h2 class="h4">
|
<h2 class="h4">
|
||||||
{{headerData[0].titelpre}}
|
{{headerData[0].titelpre}}
|
||||||
{{headerData[0].vorname}}
|
{{headerData[0].vorname}}
|
||||||
{{headerData[0].nachname}}
|
{{headerData[0].nachname}}
|
||||||
<span v-if="headerData[0].titelpost">, </span>
|
<span v-if="headerData[0].titelpost">, </span>
|
||||||
{{headerData[0].titelpost}}
|
{{headerData[0].titelpost}}
|
||||||
</h2>
|
</h2>
|
||||||
<h6 v-if="headerData[0].unruly" class="badge" :class="'bg-unruly rounded-0'"><strong>unruly</strong></h6>
|
<core-tag ref="tagComponent"
|
||||||
|
v-if="tagsEnabled"
|
||||||
|
:endpoint="tagEndpoint"
|
||||||
|
:values="prestudentIds"
|
||||||
|
@added="addedTag"
|
||||||
|
@deleted="deletedTag"
|
||||||
|
@updated="updatedTag"
|
||||||
|
zuordnung_typ="prestudent_id"
|
||||||
|
></core-tag>
|
||||||
|
<div
|
||||||
|
role="button"
|
||||||
|
v-if="tagsEnabled"
|
||||||
|
@click="rebuildPrestudentTags"
|
||||||
|
class="btn btn-outline btn-light mb-1"
|
||||||
|
:title="'Automatische Tags fuer ' + currentSemester + ' neu laden'"
|
||||||
|
>
|
||||||
|
<i class="fa-solid fa-refresh pe-1"></i>
|
||||||
|
<span>{{currentSemester}}</span>
|
||||||
</div>
|
</div>
|
||||||
|
<h6 v-if="headerData[0].unruly" class="badge" :class="'bg-unruly rounded-0'"><strong>unruly</strong></h6>
|
||||||
|
</div>
|
||||||
|
<div v-else class="d-flex align-items-center gap-3">
|
||||||
|
<pv-skeleton width="15rem" height="2rem" borderRadius="16px"></pv-skeleton>
|
||||||
|
<h6 v-if="headerData[0].unruly" class="badge" :class="'bg-unruly rounded-0'"><strong>unruly</strong></h6>
|
||||||
|
</div>
|
||||||
|
|
||||||
<h5 class="h6">
|
<h5 class="h6 d-flex align-items-center flex-wrap gap-1">
|
||||||
<strong class="text-muted">{{$p.t('lehre', 'studiengang')}} </strong>
|
<strong class="text-muted">{{$p.t('lehre', 'studiengang')}} </strong>
|
||||||
{{headerData[0].stg_bezeichnung}} ({{headerData[0].studiengang}})
|
<span v-if="!isLoading">
|
||||||
<strong v-if="headerData[0].semester" class="text-muted"> | {{$p.t('lehre', 'semester')}} </strong>
|
{{headerData[0].stg_bezeichnung}} ({{headerData[0].studiengang}})
|
||||||
{{headerData[0].semester}}
|
</span>
|
||||||
<strong v-if="headerData[0].verband" class="text-muted"> | {{$p.t('lehre', 'verband')}}</strong>
|
<span v-else>
|
||||||
{{headerData[0].verband}}
|
<pv-skeleton width="10rem"></pv-skeleton>
|
||||||
<strong v-if="headerData[0].gruppe" class="text-muted"> | {{$p.t('lehre', 'gruppe')}} </strong>
|
</span>
|
||||||
{{headerData[0].gruppe}}
|
<template v-if="!semesterStatiLoading">
|
||||||
</h5>
|
<strong v-if="headerData[0].semester != null" class="text-muted"> | {{$p.t('lehre', 'semester')}} </strong>
|
||||||
|
{{headerData[0].semester}}
|
||||||
|
<strong v-if="headerData[0].gruppe !== null && headerData[0].verband != ' '" class="text-muted"> | {{$p.t('lehre', 'verband')}}</strong>
|
||||||
|
{{headerData[0].verband}}
|
||||||
|
<strong v-if="headerData[0].gruppe !== null && headerData[0].gruppe != ' '" class="text-muted"> | {{$p.t('lehre', 'gruppe')}} </strong>
|
||||||
|
{{headerData[0].gruppe}}
|
||||||
|
<strong v-if="headerData[0].status=='Interessent'
|
||||||
|
|| headerData[0].status=='Aufgenommener'
|
||||||
|
|| headerData[0].status=='Bewerber'
|
||||||
|
|| headerData[0].status=='Wartender'"
|
||||||
|
class="text-muted"> | Einstiegssemester {{headerData[0].semester_berechnet}}
|
||||||
|
</strong>
|
||||||
|
</template>
|
||||||
|
<template v-else>
|
||||||
|
<strong class="text-muted"> | {{$p.t('lehre', 'semester')}} </strong>
|
||||||
|
<pv-skeleton size="1rem" class="mr-2"></pv-skeleton>
|
||||||
|
<strong class="text-muted"> | {{$p.t('lehre', 'verband')}}</strong>
|
||||||
|
<pv-skeleton size="1rem" class="mr-2"></pv-skeleton>
|
||||||
|
<strong class="text-muted"> | {{$p.t('lehre', 'gruppe')}} </strong>
|
||||||
|
<pv-skeleton size="1rem" class="mr-2"></pv-skeleton>
|
||||||
|
</template>
|
||||||
|
</h5>
|
||||||
|
|
||||||
<h5 class="h6">
|
<h5 class="h6 d-flex align-items-center flex-wrap gap-1">
|
||||||
<strong class="text-muted">Email </strong>
|
<strong class="text-muted">Email </strong>
|
||||||
<span>
|
<span v-if="!isLoading">
|
||||||
<a :href="'mailto:'+headerData[0]?.mail_intern">{{headerData[0].mail_intern}}</a>
|
<a :href="'mailto:'+headerData[0]?.mail_intern">{{headerData[0].mail_intern}}</a>
|
||||||
</span>
|
</span>
|
||||||
<strong v-if="headerData[0].statusofsemester" class="text-muted"> | Status </strong>
|
<span v-else>
|
||||||
{{headerData[0].statusofsemester}}
|
<pv-skeleton width="10rem"></pv-skeleton>
|
||||||
</h5>
|
</span>
|
||||||
|
<strong class="text-muted"> | {{$p.t('ui', 'private')}} </strong>
|
||||||
</div>
|
<span v-if="!isLoading">
|
||||||
<div v-if="headerData.length == 1" class="col-md-1 d-flex flex-column align-items-end justify-content-start ms-auto">
|
<a :href="'mailto:'+headerData[0]?.mail_privat">{{headerData[0].mail_privat}}</a>
|
||||||
<div class="d-flex py-1">
|
</span>
|
||||||
<div class="px-2" style="min-width: 100px;">
|
<span v-else>
|
||||||
<slot name="issues"></slot>
|
<pv-skeleton width="10rem"></pv-skeleton>
|
||||||
</div>
|
</span>
|
||||||
<div v-if="hasTileGammaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
<strong class="text-muted"> | Status </strong>
|
||||||
<h4 class="mb-1 text-center"><slot name="titleGammaTile"></slot></h4>
|
<span v-if="noCurrentStatus">
|
||||||
<h6 class="text-muted text-center"><slot name="valueGammaTile"></slot></h6>
|
<strong class="text-danger">{{$p.t('lehre', 'textNoStatusInSem', { sem: currentSemester}) }}</strong>
|
||||||
</div>
|
</span>
|
||||||
<div v-if="hasTileBetaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
<span v-else>
|
||||||
<h4 class="mb-1 text-center"><slot name="titleBetaTile"></slot></h4>
|
{{headerData[0].statusofsemester}}
|
||||||
<h6 class="text-muted text-center"><slot name="valueBetaTile"></slot></h6>
|
</span>
|
||||||
</div>
|
</h5>
|
||||||
<div v-if="hasTileAlphaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
<div ref="tagWrapper"></div>
|
||||||
<h4 class="mb-1 text-center"><slot name="titleAlphaTile"></slot></h4>
|
</div>
|
||||||
<h6 class="text-muted text-center"><slot name="valueAlphaTile"></slot></h6>
|
<div v-if="headerData.length == 1" class="col-md-1 d-flex flex-column align-items-end justify-content-start ms-auto">
|
||||||
</div>
|
<div class="d-flex py-1">
|
||||||
<div v-if="hasTileUIDSlot" class="px-2" style="border-left: 1px solid #EEE">
|
<div class="px-2" style="min-width: 100px;">
|
||||||
<h4 class="mb-1 text-center">UID</h4>
|
<slot name="issues"></slot>
|
||||||
<h6 class="text-muted text-center"><slot name="uid"></slot></h6>
|
</div>
|
||||||
</div>
|
<div v-if="hasTileGammaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||||
|
<h4 class="mb-1 text-center"><slot name="titleGammaTile"></slot></h4>
|
||||||
|
<h6 class="text-muted d-flex align-items-center justify-content-center flex-wrap gap-1">
|
||||||
|
<pv-skeleton v-if="isLoading" width="4rem"></pv-skeleton>
|
||||||
|
<slot v-else name="valueGammaTile"></slot>
|
||||||
|
</h6>
|
||||||
|
</div>
|
||||||
|
<div v-if="hasTileBetaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||||
|
<h4 class="mb-1 text-center"><slot name="titleBetaTile"></slot></h4>
|
||||||
|
<h6 class="text-muted d-flex align-items-center justify-content-center flex-wrap gap-1">
|
||||||
|
<pv-skeleton v-if="isLoading" width="4rem"></pv-skeleton>
|
||||||
|
<slot v-else name="valueBetaTile"></slot>
|
||||||
|
</h6>
|
||||||
|
</div>
|
||||||
|
<div v-if="hasTileAlphaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||||
|
<h4 class="mb-1 text-center"><slot name="titleAlphaTile"></slot></h4>
|
||||||
|
<h6 class="text-muted d-flex align-items-center justify-content-center flex-wrap gap-1">
|
||||||
|
<pv-skeleton v-if="isLoading" width="4rem"></pv-skeleton>
|
||||||
|
<slot v-else name="valueAlphaTile"></slot>
|
||||||
|
</h6>
|
||||||
|
</div>
|
||||||
|
<div v-if="hasTileUIDSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||||
|
<h4 class="mb-1 text-center">UID</h4>
|
||||||
|
<h6 class="text-muted d-flex align-items-center justify-content-center flex-wrap gap-1">
|
||||||
|
<pv-skeleton v-if="isLoading" width="4rem"></pv-skeleton>
|
||||||
|
<slot v-else name="uid"></slot>
|
||||||
|
</h6>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -330,27 +550,51 @@ export default {
|
|||||||
|
|
||||||
<!--show Ma-Details-->
|
<!--show Ma-Details-->
|
||||||
<div class="col-md-9 text-nowrap mt-2">
|
<div class="col-md-9 text-nowrap mt-2">
|
||||||
<h4>{{headerDataMa.titelpre}} {{headerDataMa.vorname}} {{headerDataMa.nachname}}<span v-if="headerDataMa?.titelpost">, </span> {{headerDataMa.titelpost}}</h4>
|
<h4 v-if="!headerDataMaLoading">{{headerDataMa.titelpre}} {{headerDataMa.vorname}} {{headerDataMa.nachname}}<span v-if="headerDataMa?.titelpost">, </span> {{headerDataMa.titelpost}}</h4>
|
||||||
<strong class="text-muted">{{departmentData.organisationseinheittyp_kurzbz}}</strong>
|
<h4 v-else><pv-skeleton width="15rem" height="2rem" borderRadius="16px"></pv-skeleton></h4>
|
||||||
{{departmentData.bezeichnung}}
|
<div class="d-flex align-items-center flex-wrap gap-1">
|
||||||
<span v-if="leitungData.uid"> | </span>
|
<strong class="text-muted">{{departmentData.organisationseinheittyp_kurzbz}}</strong>
|
||||||
<strong v-if="leitungData.uid" class="text-muted">Vorgesetzte*r </strong>
|
<span v-if="!departmentDataLoading">
|
||||||
<a href="#" @click.prevent="goToLeitung">
|
{{departmentData.bezeichnung}}
|
||||||
{{leitungData.titelpre}} {{leitungData.vorname}} {{leitungData.nachname}}
|
</span>
|
||||||
</a>
|
<span v-else>
|
||||||
<p>
|
<pv-skeleton width="12rem"></pv-skeleton>
|
||||||
<strong class="text-muted">Email </strong>
|
</span>
|
||||||
<span v-if="headerDataMa && (headerDataMa.alias === undefined || headerDataMa.alias === null || headerDataMa.alias === '')">
|
<span v-if="leitungData.uid"> | </span>
|
||||||
<a :href="'mailto:' + mitarbeiter_uid + '@' + domain">
|
<strong v-if="leitungData.uid" class="text-muted">Vorgesetzte*r </strong>
|
||||||
{{ mitarbeiter_uid }}@{{ domain }}
|
<span v-if="!leitungOrgLoading">
|
||||||
|
<a href="#" @click.prevent="goToLeitung">
|
||||||
|
{{leitungData.titelpre}} {{leitungData.vorname}} {{leitungData.nachname}}
|
||||||
</a>
|
</a>
|
||||||
</span>
|
</span>
|
||||||
<span v-else>
|
<span v-else>
|
||||||
<a :href="'mailto:'+headerDataMa?.alias+'@'+domain">{{headerDataMa.alias}}@{{domain}}</a>
|
<pv-skeleton width="5rem"></pv-skeleton>
|
||||||
</span>
|
</span>
|
||||||
<span v-if="headerDataMa?.telefonklappe" class="mb-2"> | <strong class="text-muted">DW </strong>{{headerDataMa?.telefonklappe}}</span>
|
</div>
|
||||||
</p>
|
|
||||||
|
<div class="d-flex align-items-center gap-2 flex-nowrap">
|
||||||
|
<div class="d-flex align-items-center gap-1">
|
||||||
|
<strong class="text-muted">Email</strong>
|
||||||
|
<template v-if="!headerDataMaLoading">
|
||||||
|
<a :href="'mailto:' + (headerDataMa?.alias || mitarbeiter_uid) + '@' + domain">
|
||||||
|
{{ (headerDataMa?.alias || mitarbeiter_uid) + '@' + domain }}
|
||||||
|
</a>
|
||||||
|
</template>
|
||||||
|
<pv-skeleton v-else width="10rem"></pv-skeleton>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div v-if="headerDataMa?.telefonklappe" class="d-flex align-items-center gap-1">
|
||||||
|
<span>|</span>
|
||||||
|
<strong class="text-muted">DW</strong>
|
||||||
|
<template v-if="!headerDataMaLoading">
|
||||||
|
{{ headerDataMa.telefonklappe }}
|
||||||
|
</template>
|
||||||
|
<pv-skeleton v-else width="4rem"></pv-skeleton>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<slot name="tag"></slot>
|
<slot name="tag"></slot>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-1 d-flex flex-column align-items-end justify-content-start ms-auto">
|
<div class="col-md-1 d-flex flex-column align-items-end justify-content-start ms-auto">
|
||||||
@@ -360,20 +604,33 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="hasTileGammaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
<div v-if="hasTileGammaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||||
<h4 class="mb-1 text-center"><slot name="titleGammaTile"></slot></h4>
|
<h4 class="mb-1 text-center"><slot name="titleGammaTile"></slot></h4>
|
||||||
<h6 class="text-muted text-center"><slot name="valueGammaTile"></slot></h6>
|
<h6 class="text-muted d-flex align-items-center justify-content-center flex-wrap gap-1">
|
||||||
|
<pv-skeleton v-if="isLoading" width="4rem"></pv-skeleton>
|
||||||
|
<slot v-else name="valueGammaTile"></slot>
|
||||||
|
</h6>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="hasTileBetaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
<div v-if="hasTileBetaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||||
<h4 class="mb-1 text-center"><slot name="titleBetaTile"></slot></h4>
|
<h4 class="mb-1 text-center"><slot name="titleBetaTile"></slot></h4>
|
||||||
<h6 class="text-muted text-center"><slot name="valueBetaTile" :valueBetaTile="valueBetaTile"></slot></h6>
|
<h6 class="text-muted d-flex align-items-center justify-content-center flex-wrap gap-1">
|
||||||
|
<pv-skeleton v-if="isLoading" width="4rem"></pv-skeleton>
|
||||||
|
<slot v-else name="valueBetaTile"></slot>
|
||||||
|
</h6>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="hasTileAlphaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
<div v-if="hasTileAlphaSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||||
<h4 class="mb-1 text-center"><slot name="titleAlphaTile"></slot></h4>
|
<h4 class="mb-1 text-center"><slot name="titleAlphaTile"></slot></h4>
|
||||||
<h6 class="text-muted text-center"><slot name="valueAlphaTile"></slot></h6>
|
<h6 class="text-muted d-flex align-items-center justify-content-center flex-wrap gap-1">
|
||||||
|
<pv-skeleton v-if="isLoading" width="4rem"></pv-skeleton>
|
||||||
|
<slot v-else name="valueAlphaTile"></slot>
|
||||||
|
</h6>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="hasTileUIDSlot" class="px-2" style="border-left: 1px solid #EEE">
|
<div v-if="hasTileUIDSlot" class="px-2" style="border-left: 1px solid #EEE">
|
||||||
<h4 class="mb-1 text-center">UID</h4>
|
<h4 class="mb-1 text-center">UID</h4>
|
||||||
<h6 class="text-muted text-center"><slot name="uid"></slot></h6>
|
<h6 class="text-muted d-flex align-items-center justify-content-center flex-wrap gap-1">
|
||||||
|
<pv-skeleton v-if="isLoading" width="4rem"></pv-skeleton>
|
||||||
|
<slot v-else name="uid"></slot>
|
||||||
|
</h6>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,8 @@ export default {
|
|||||||
label: String,
|
label: String,
|
||||||
// NOTE(chris): remove these from $attrs array to prevent doubled event listeners
|
// NOTE(chris): remove these from $attrs array to prevent doubled event listeners
|
||||||
onInput: [Array, Function],
|
onInput: [Array, Function],
|
||||||
'onUpdate:modelValue': [Array, Function]
|
'onUpdate:modelValue': [Array, Function],
|
||||||
|
titleActionButton: String
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -317,6 +318,7 @@ export default {
|
|||||||
:id="idCmp"
|
:id="idCmp"
|
||||||
:name="name"
|
:name="name"
|
||||||
:class="validationClass"
|
:class="validationClass"
|
||||||
|
:titleActionButton="titleActionButton"
|
||||||
@update:model-value="clearValidationForThisName"
|
@update:model-value="clearValidationForThisName"
|
||||||
>
|
>
|
||||||
<slot></slot>
|
<slot></slot>
|
||||||
|
|||||||
@@ -1,9 +1,14 @@
|
|||||||
export default {
|
export default {
|
||||||
emits: [
|
emits: [
|
||||||
'update:modelValue'
|
'update:modelValue',
|
||||||
|
'actionbutton-clicked'
|
||||||
],
|
],
|
||||||
props: {
|
props: {
|
||||||
modelValue: String
|
modelValue: String,
|
||||||
|
titleActionButton: {
|
||||||
|
type: String,
|
||||||
|
default: ""
|
||||||
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
valueAsBase64DataString() {
|
valueAsBase64DataString() {
|
||||||
@@ -28,6 +33,9 @@ export default {
|
|||||||
},
|
},
|
||||||
deleteImage() {
|
deleteImage() {
|
||||||
this.$emit('update:modelValue', '');
|
this.$emit('update:modelValue', '');
|
||||||
|
},
|
||||||
|
emitAction(){
|
||||||
|
this.$emit('actionbutton-clicked', this.modelValue);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
@@ -42,6 +50,7 @@ export default {
|
|||||||
<button type="button" class="btn btn-outline-dark btn-sm" @click="openUploadDialog">
|
<button type="button" class="btn btn-outline-dark btn-sm" @click="openUploadDialog">
|
||||||
<i class="fa fa-pen"></i>
|
<i class="fa fa-pen"></i>
|
||||||
</button>
|
</button>
|
||||||
|
<button v-if="titleActionButton" class="btn btn-outline-dark btn-sm" @click="emitAction">{{titleActionButton}}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -551,7 +551,6 @@ export default {
|
|||||||
container-class="mb-3 col-3"
|
container-class="mb-3 col-3"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="formData.datum_von"
|
v-model="formData.datum_von"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="datum_von"
|
name="datum_von"
|
||||||
:label="$p.t('ui/from') + ' *'"
|
:label="$p.t('ui/from') + ' *'"
|
||||||
auto-apply
|
auto-apply
|
||||||
@@ -567,7 +566,6 @@ export default {
|
|||||||
container-class="mb-3 col-3"
|
container-class="mb-3 col-3"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="formData.datum_bis"
|
v-model="formData.datum_bis"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="datum_bis"
|
name="datum_bis"
|
||||||
:label="$p.t('global/bis')"
|
:label="$p.t('global/bis')"
|
||||||
auto-apply
|
auto-apply
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
import CoreSearchbar from "../searchbar/searchbar.js";
|
import CoreSearchbar from "../searchbar/searchbar.js";
|
||||||
import NavLanguage from "../navigation/Language.js";
|
import NavLanguage from "../navigation/Language.js";
|
||||||
import VerticalSplit from "../verticalsplit/verticalsplit.js";
|
import VerticalSplit from "../verticalsplit/verticalsplit.js";
|
||||||
|
import HorizontalSplit from "../horizontalsplit/horizontalsplit.js";
|
||||||
import AppMenu from "../AppMenu.js";
|
import AppMenu from "../AppMenu.js";
|
||||||
import AppConfig from "../AppConfig.js";
|
import AppConfig from "../AppConfig.js";
|
||||||
import StvVerband from "./Studentenverwaltung/Verband.js";
|
import StvVerband from "./Studentenverwaltung/Verband.js";
|
||||||
@@ -37,6 +38,7 @@ export default {
|
|||||||
CoreSearchbar,
|
CoreSearchbar,
|
||||||
NavLanguage,
|
NavLanguage,
|
||||||
VerticalSplit,
|
VerticalSplit,
|
||||||
|
HorizontalSplit,
|
||||||
AppMenu,
|
AppMenu,
|
||||||
AppConfig,
|
AppConfig,
|
||||||
StvVerband,
|
StvVerband,
|
||||||
@@ -192,7 +194,44 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return extraItems;
|
return extraItems;
|
||||||
}
|
},
|
||||||
|
appMenuLvPlanungItems() {
|
||||||
|
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/lvplanung.xls.php?'
|
||||||
|
+ '&studiengang_kz=' + studiengang_kz
|
||||||
|
+ '&semester=' + semester
|
||||||
|
+ '&studiensemester_kurzbz=' + this.studiensemesterKurzbz
|
||||||
|
+ '&orgform_kurzbz=' + orgform,
|
||||||
|
description: 'stv/lvplanung_xls'
|
||||||
|
});
|
||||||
|
extraItems.push({
|
||||||
|
link: FHC_JS_DATA_STORAGE_OBJECT.app_root
|
||||||
|
+ 'content/statistik/lvplanung.php?'
|
||||||
|
+ '&studiengang_kz=' + studiengang_kz
|
||||||
|
+ '&semester=' + semester,
|
||||||
|
description: 'stv/lvplanung_html'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return extraItems;
|
||||||
|
},
|
||||||
|
linkRt(){
|
||||||
|
return FHC_JS_DATA_STORAGE_OBJECT.app_root + '/vilesci/stammdaten/reihungstestverwaltung.php'
|
||||||
|
},
|
||||||
|
selected_uid(){
|
||||||
|
return this.selected?.[this.selected.length - 1]?.uid ?? null;
|
||||||
|
},
|
||||||
|
linkGradeList(){
|
||||||
|
return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'index.ci.php/person/gradelist/index/' + this.selected_uid
|
||||||
|
},
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
'url_studiensemester_kurzbz': function (newVal, oldVal) {
|
'url_studiensemester_kurzbz': function (newVal, oldVal) {
|
||||||
@@ -212,6 +251,7 @@ export default {
|
|||||||
'url_studiengang': function (newVal, oldVal) {
|
'url_studiengang': function (newVal, oldVal) {
|
||||||
if (newVal !== oldVal) {
|
if (newVal !== oldVal) {
|
||||||
this.checkUrlStudiengang();
|
this.checkUrlStudiengang();
|
||||||
|
this.$refs.stvList.clearSelection();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
'url_mode': function () {
|
'url_mode': function () {
|
||||||
@@ -235,6 +275,10 @@ export default {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
sidebarCollapsed(newVal) {
|
||||||
|
if(newVal) this.$refs.hSplit.collapseLeft()
|
||||||
|
else this.$refs.hSplit.showBoth()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -431,6 +475,9 @@ export default {
|
|||||||
},
|
},
|
||||||
deleteCustomFilter(){
|
deleteCustomFilter(){
|
||||||
this.$refs.stvList.resetFilter();
|
this.$refs.stvList.resetFilter();
|
||||||
|
},
|
||||||
|
showAlertNoSelectedStudent(){
|
||||||
|
this.$fhcAlert.alertError(this.$p.t('ui', 'alert_chooseStudent'));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
@@ -629,26 +676,69 @@ export default {
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<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/lvplanung') }}
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu p-0">
|
||||||
|
<li
|
||||||
|
v-for="(item, key) in appMenuLvPlanungItems"
|
||||||
|
:key="key"
|
||||||
|
>
|
||||||
|
<a class="dropdown-item" :href="item.link" target="_blank">
|
||||||
|
{{ $p.t(item.description) }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a :href="linkRt" target="_blank">
|
||||||
|
{{ $p.t('stv/RTVerwaltung') }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a v-if="selected_uid" :href="linkGradeList" target="_blank">
|
||||||
|
{{ $p.t('stv/studienverlauf') }}
|
||||||
|
</a>
|
||||||
|
<a v-else href="#" @click.prevent="showAlertNoSelectedStudent">
|
||||||
|
{{ $p.t('stv/studienverlauf') }}
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
</app-menu>
|
</app-menu>
|
||||||
</div>
|
</div>
|
||||||
</aside>
|
</aside>
|
||||||
<nav id="sidebarMenu" class="bg-light offcanvas offcanvas-start col-md p-md-0 h-100">
|
<horizontal-split ref="hSplit" :defaultRatio="[15, 85]">
|
||||||
<div class="offcanvas-header justify-content-end px-1 d-md-none">
|
<template #left>
|
||||||
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" :aria-label="$p.t('ui/schliessen')"></button>
|
<nav id="sidebarMenu" class="bg-light offcanvas offcanvas-start col-md p-md-0 h-100 w-100">
|
||||||
</div>
|
<div class="offcanvas-header justify-content-end px-1 d-md-none">
|
||||||
<stv-verband :preselectedKey="studiengangKz ? '' + studiengangKz : null" :endpoint="verbandEndpoint" @select-verband="onSelectVerband" class="col" style="height:0%"></stv-verband>
|
<button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" :aria-label="$p.t('ui/schliessen')"></button>
|
||||||
<stv-studiensemester v-model:studiensemester-kurzbz="studiensemesterKurzbz" @update:studiensemester-kurzbz="studiensemesterChanged"></stv-studiensemester>
|
</div>
|
||||||
</nav>
|
<stv-verband :preselectedKey="studiengangKz ? '' + studiengangKz : null" :endpoint="verbandEndpoint" @select-verband="onSelectVerband" class="col" style="height:0%"></stv-verband>
|
||||||
<main class="col-md-8 ms-sm-auto col-lg-9 col-xl-10">
|
<stv-studiensemester v-model:studiensemester-kurzbz="studiensemesterKurzbz" @update:studiensemester-kurzbz="studiensemesterChanged"></stv-studiensemester>
|
||||||
<vertical-split>
|
</nav>
|
||||||
<template #top>
|
</template>
|
||||||
<stv-list ref="stvList" v-model:selected="selected" :studiengang-kz="studiengangKz" :studiensemester-kurzbz="studiensemesterKurzbz" @filterActive="handleCustomFilter"></stv-list>
|
<template #right>
|
||||||
</template>
|
<main>
|
||||||
<template #bottom>
|
<vertical-split :defaultRatio="[50, 50]">
|
||||||
<stv-details ref="details" :students="selected" @reload="reloadList"></stv-details>
|
<template #top>
|
||||||
</template>
|
<stv-list ref="stvList" v-model:selected="selected" :studiengang-kz="studiengangKz" :studiensemester-kurzbz="studiensemesterKurzbz" @filterActive="handleCustomFilter"></stv-list>
|
||||||
</vertical-split>
|
</template>
|
||||||
</main>
|
<template #bottom>
|
||||||
|
<stv-details ref="details" :students="selected" @reload="reloadList"></stv-details>
|
||||||
|
</template>
|
||||||
|
</vertical-split>
|
||||||
|
</main>
|
||||||
|
</template>
|
||||||
|
</horizontal-split>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<app-config ref="config" v-model="appconfig" :endpoints="configEndpoints"></app-config>
|
<app-config ref="config" v-model="appconfig" :endpoints="configEndpoints"></app-config>
|
||||||
|
|||||||
@@ -2,12 +2,18 @@ import FhcTabs from "../../Tabs.js";
|
|||||||
import FhcHeader from "../../DetailHeader/DetailHeader.js";
|
import FhcHeader from "../../DetailHeader/DetailHeader.js";
|
||||||
|
|
||||||
import ApiStvApp from '../../../api/factory/stv/app.js';
|
import ApiStvApp from '../../../api/factory/stv/app.js';
|
||||||
|
import ApiStudent from '../../../api/factory/stv/students.js';
|
||||||
|
|
||||||
// TODO(chris): alt & title
|
// TODO(chris): alt & title
|
||||||
// TODO(chris): phrasen
|
// TODO(chris): phrasen
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "DetailsPrestudent",
|
name: "DetailsPrestudent",
|
||||||
|
inject: {
|
||||||
|
currentSemester: {
|
||||||
|
from: 'currentSemester',
|
||||||
|
},
|
||||||
|
},
|
||||||
components: {
|
components: {
|
||||||
FhcTabs,
|
FhcTabs,
|
||||||
FhcHeader
|
FhcHeader
|
||||||
@@ -15,7 +21,9 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
configStudent: {},
|
configStudent: {},
|
||||||
configStudents: {}
|
configStudents: {},
|
||||||
|
activeTab: null,
|
||||||
|
localStudent: null
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
@@ -40,6 +48,9 @@ export default {
|
|||||||
}
|
}
|
||||||
return Object.fromEntries(Object.entries(this.configStudents).filter(([ , value ]) => !value.showOnlyWithUid && !value.showOnlyWithUid));
|
return Object.fromEntries(Object.entries(this.configStudents).filter(([ , value ]) => !value.showOnlyWithUid && !value.showOnlyWithUid));
|
||||||
},
|
},
|
||||||
|
isLoading() {
|
||||||
|
return this.students === null; //null-> loading, [] -> empty, [...] -> data, necessary for skeleton in child
|
||||||
|
},
|
||||||
tile_PersId(){
|
tile_PersId(){
|
||||||
let tile = this.students[0].person_id != null ? this.students[0].person_id : '-';
|
let tile = this.students[0].person_id != null ? this.students[0].person_id : '-';
|
||||||
return tile;
|
return tile;
|
||||||
@@ -57,6 +68,21 @@ export default {
|
|||||||
'$p.user_language.value'(n, o) {
|
'$p.user_language.value'(n, o) {
|
||||||
if (n !== o && o !== undefined)
|
if (n !== o && o !== undefined)
|
||||||
this.loadConfig();
|
this.loadConfig();
|
||||||
|
},
|
||||||
|
currentSemester(newVal) {
|
||||||
|
if (
|
||||||
|
Array.isArray(this.students) &&
|
||||||
|
this.students.length === 1 &&
|
||||||
|
newVal !== this.students[0].query_studiensemester_kurzbz
|
||||||
|
) {
|
||||||
|
this.reloadDataStudent();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.localStudent = null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
students() {
|
||||||
|
this.localStudent = null;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -74,10 +100,28 @@ export default {
|
|||||||
})
|
})
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
.catch(this.$fhcAlert.handleSystemError);
|
||||||
},
|
},
|
||||||
|
handleTabChanged(key) {
|
||||||
|
this.activeTab = key
|
||||||
|
this.reload()
|
||||||
|
},
|
||||||
reload() {
|
reload() {
|
||||||
if (this.$refs.tabs?.$refs?.current?.reload)
|
if (this.$refs.tabs?.$refs?.current?.reload)
|
||||||
this.$refs.tabs.$refs.current.reload();
|
this.$refs.tabs.$refs.current.reload();
|
||||||
},
|
},
|
||||||
|
reloadDataStudent(){
|
||||||
|
this.localStudent = null;
|
||||||
|
const studentArr = this.students;
|
||||||
|
|
||||||
|
if (!studentArr || !studentArr.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.$api
|
||||||
|
.call(ApiStudent.uid(studentArr[0].uid, this.currentSemester))
|
||||||
|
.then(result => {
|
||||||
|
this.localStudent = result.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
reloadList() {
|
reloadList() {
|
||||||
this.$emit('reload');
|
this.$emit('reload');
|
||||||
},
|
},
|
||||||
@@ -92,10 +136,12 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
<div v-else-if="configStudent && configStudents" class="d-flex flex-column h-100">
|
<div v-else-if="configStudent && configStudents" class="d-flex flex-column h-100">
|
||||||
<fhc-header
|
<fhc-header
|
||||||
:headerData="students"
|
:headerData="localStudent || students"
|
||||||
|
:currentSemester="currentSemester"
|
||||||
typeHeader="student"
|
typeHeader="student"
|
||||||
@reload="reloadList"
|
@reload="reloadList"
|
||||||
fotoEditable
|
fotoEditable
|
||||||
|
:isLoading="isLoading"
|
||||||
>
|
>
|
||||||
<template #uid>{{students[0].uid}}</template>
|
<template #uid>{{students[0].uid}}</template>
|
||||||
<template #titleAlphaTile>PersID</template>
|
<template #titleAlphaTile>PersID</template>
|
||||||
@@ -107,16 +153,16 @@ export default {
|
|||||||
</fhc-header>
|
</fhc-header>
|
||||||
<fhc-tabs
|
<fhc-tabs
|
||||||
v-if="students.length == 1"
|
v-if="students.length == 1"
|
||||||
ref="tabs"
|
ref="tabs"
|
||||||
:useprimevue="true"
|
:useprimevue="true"
|
||||||
:modelValue="students[0]"
|
:modelValue="(Array.isArray(localStudent) && localStudent[0]) || students[0]"
|
||||||
:config="config"
|
:config="config"
|
||||||
:default="$route.params.tab"
|
:default="activeTab ?? $route.params.tab"
|
||||||
style="flex: 1 1 0%; height: 0%"
|
style="flex: 1 1 0%; height: 0%"
|
||||||
@changed="reload"
|
@changed="handleTabChanged"
|
||||||
>
|
>
|
||||||
</fhc-tabs>
|
</fhc-tabs>
|
||||||
<fhc-tabs v-else ref="tabs" :useprimevue="true" :modelValue="students" :config="config" :default="$route.params.tab" style="flex: 1 1 0%; height: 0%" @changed="reload"></fhc-tabs>
|
<fhc-tabs v-else ref="tabs" :useprimevue="true" :modelValue="students" :config="config" :default="activeTab ?? $route.params.tab" style="flex: 1 1 0%; height: 0%" @changed="handleTabChanged"></fhc-tabs>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
Loading...
|
Loading...
|
||||||
|
|||||||
+186
-38
@@ -78,7 +78,7 @@ export default {
|
|||||||
layout: 'fitDataStretchFrozen',
|
layout: 'fitDataStretchFrozen',
|
||||||
layoutColumnsOnNewData: false,
|
layoutColumnsOnNewData: false,
|
||||||
height: 'auto',
|
height: 'auto',
|
||||||
minHeight: '200',
|
minHeight: '200'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -238,6 +238,16 @@ export default {
|
|||||||
}
|
}
|
||||||
return this.student.map(e => e.uid);
|
return this.student.map(e => e.uid);
|
||||||
},
|
},
|
||||||
|
studentNames() {
|
||||||
|
if (this.student.uid)
|
||||||
|
{
|
||||||
|
return [this.student.vorname + ' ' + this.student.nachname];
|
||||||
|
}
|
||||||
|
|
||||||
|
const array = this.student.map(e => ' ' + e.vorname + ' ' + e.nachname + '(' + e.uid +')');
|
||||||
|
|
||||||
|
return array.toString();
|
||||||
|
},
|
||||||
studentKzs(){
|
studentKzs(){
|
||||||
if (this.student.uid)
|
if (this.student.uid)
|
||||||
{
|
{
|
||||||
@@ -287,10 +297,51 @@ export default {
|
|||||||
.catch(this.$fhcAlert.handleSystemError);
|
.catch(this.$fhcAlert.handleSystemError);
|
||||||
},
|
},
|
||||||
actionNewAbschlusspruefung() {
|
actionNewAbschlusspruefung() {
|
||||||
this.resetForm();
|
|
||||||
this.statusNew = true;
|
|
||||||
this.$refs.finalexamModal.show();
|
|
||||||
this.setDefaultFormData();
|
this.setDefaultFormData();
|
||||||
|
this.statusNew = true;
|
||||||
|
|
||||||
|
//prepare local Storage
|
||||||
|
let STORAGE_KEY = 'finalExamDefaultData';
|
||||||
|
const id = '20260625_01';
|
||||||
|
const stored = JSON.parse(localStorage.getItem(STORAGE_KEY)) || {};
|
||||||
|
|
||||||
|
if (stored[id]) {
|
||||||
|
const data = stored[id];
|
||||||
|
|
||||||
|
this.formData.pruefungstyp_kurzbz = data.pruefungstyp_kurzbz;
|
||||||
|
this.formData.datum = data.datum;
|
||||||
|
this.formData.sponsion = data.sponsion;
|
||||||
|
this.formData.akadgrad_id = data.akadgrad_id;
|
||||||
|
this.formData.pruefungsantritt_kurzbz = data.pruefungsantritt_kurzbz;
|
||||||
|
|
||||||
|
if (data.vorsitz_uid) {
|
||||||
|
this.selectedVorsitz = {
|
||||||
|
mitarbeiter_uid: data.vorsitz_uid,
|
||||||
|
person_id: data.vorsitz_person_id,
|
||||||
|
label: data.vorsitz_label
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.pruefer1_person_id) {
|
||||||
|
this.selectedPruefer1 = {
|
||||||
|
person_id: data.pruefer1_person_id,
|
||||||
|
label: data.pruefer1_label
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (data.pruefer2_person_id) {
|
||||||
|
this.selectedPruefer2 = {
|
||||||
|
person_id: data.pruefer2_person_id,
|
||||||
|
label: data.pruefer2_label
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (data.pruefer3_person_id) {
|
||||||
|
this.selectedPruefer3 = {
|
||||||
|
person_id: data.pruefer3_person_id,
|
||||||
|
label: data.pruefer3_label
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.$refs.finalexamModal.show();
|
||||||
},
|
},
|
||||||
actionEditAbschlusspruefung(abschlusspruefung_id) {
|
actionEditAbschlusspruefung(abschlusspruefung_id) {
|
||||||
this.resetForm();
|
this.resetForm();
|
||||||
@@ -305,20 +356,23 @@ export default {
|
|||||||
};
|
};
|
||||||
if (data.p1_person_id) {
|
if (data.p1_person_id) {
|
||||||
this.selectedPruefer1 = {
|
this.selectedPruefer1 = {
|
||||||
label: this.getPersonLabel(data.p1_titelpre, data.p1_nachname, data.p1_vorname, data.p1_titelpost),
|
label: this.getPersonLabel(data.p1_titelpre, data.p1_nachname, data.p1_vorname, data.p1_titelpost, data.p1_uid),
|
||||||
person_id: data.p1_person_id
|
person_id: data.p1_person_id,
|
||||||
|
mitarbeiter_uid: data.p1_uid
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (data.p2_person_id) {
|
if (data.p2_person_id) {
|
||||||
this.selectedPruefer2 = {
|
this.selectedPruefer2 = {
|
||||||
label: this.getPersonLabel(data.p2_titelpre, data.p2_nachname, data.p2_vorname, data.p2_titelpost),
|
label: this.getPersonLabel(data.p2_titelpre, data.p2_nachname, data.p2_vorname, data.p2_titelpost, data.p2_uid),
|
||||||
person_id: data.p2_person_id
|
person_id: data.p2_person_id,
|
||||||
|
mitarbeiter_uid: data.p2_uid
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if (data.p3_person_id) {
|
if (data.p3_person_id) {
|
||||||
this.selectedPruefer3= {
|
this.selectedPruefer3= {
|
||||||
label: this.getPersonLabel(data.p3_titelpre, data.p3_nachname, data.p3_vorname, data.p3_titelpost),
|
label: this.getPersonLabel(data.p3_titelpre, data.p3_nachname, data.p3_vorname, data.p3_titelpost, data.p3_uid),
|
||||||
person_id: data.p3_person_id
|
person_id: data.p3_person_id,
|
||||||
|
mitarbeiter_uid: data.p3_uid
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -337,6 +391,30 @@ export default {
|
|||||||
.then(this.deleteAbschlusspruefung)
|
.then(this.deleteAbschlusspruefung)
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
.catch(this.$fhcAlert.handleSystemError);
|
||||||
},
|
},
|
||||||
|
saveOrUpdateLocalStorage(){
|
||||||
|
let STORAGE_KEY = 'finalExamDefaultData';
|
||||||
|
|
||||||
|
const id = '20260625_01';
|
||||||
|
const stored = JSON.parse(localStorage.getItem(STORAGE_KEY)) || {};
|
||||||
|
|
||||||
|
stored[id] = {
|
||||||
|
pruefungstyp_kurzbz: this.formData.pruefungstyp_kurzbz,
|
||||||
|
pruefungsantritt_kurzbz: this.formData.pruefungsantritt_kurzbz,
|
||||||
|
vorsitz_uid: this.selectedVorsitz?.mitarbeiter_uid || null,
|
||||||
|
vorsitz_person_id: this.selectedVorsitz?.person_id || null,
|
||||||
|
vorsitz_label: this.selectedVorsitz?.label || null,
|
||||||
|
pruefer1_person_id: this.selectedPruefer1?.person_id || null,
|
||||||
|
pruefer1_label: this.selectedPruefer1?.label || null,
|
||||||
|
pruefer2_person_id: this.selectedPruefer2?.person_id || null,
|
||||||
|
pruefer2_label: this.selectedPruefer2?.label || null,
|
||||||
|
pruefer3_person_id: this.selectedPruefer3?.person_id || null,
|
||||||
|
pruefer3_label: this.selectedPruefer3?.label || null,
|
||||||
|
akadgrad_id: this.formData.akadgrad_id,
|
||||||
|
datum: this.formData.datum,
|
||||||
|
sponsion: this.formData.sponsion
|
||||||
|
};
|
||||||
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(stored));
|
||||||
|
},
|
||||||
addNewAbschlusspruefung() {
|
addNewAbschlusspruefung() {
|
||||||
const dataToSend = {
|
const dataToSend = {
|
||||||
uid: this.student.uid,
|
uid: this.student.uid,
|
||||||
@@ -347,6 +425,8 @@ export default {
|
|||||||
.call(ApiStvAbschlusspruefung.addNewAbschlusspruefung(dataToSend))
|
.call(ApiStvAbschlusspruefung.addNewAbschlusspruefung(dataToSend))
|
||||||
.then(response => {
|
.then(response => {
|
||||||
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
|
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
|
||||||
|
//save formData fields in LocalStorage
|
||||||
|
this.saveOrUpdateLocalStorage();
|
||||||
this.hideModal('finalexamModal');
|
this.hideModal('finalexamModal');
|
||||||
this.resetForm();
|
this.resetForm();
|
||||||
})
|
})
|
||||||
@@ -355,6 +435,43 @@ export default {
|
|||||||
this.reload();
|
this.reload();
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
async addNewAbschlusspruefungMulti(){
|
||||||
|
try {
|
||||||
|
const arraySuccessfullySent = [];
|
||||||
|
const arrayError = [];
|
||||||
|
|
||||||
|
for (const student of this.studentUids) {
|
||||||
|
try {
|
||||||
|
await this.$refs.formFinalExam.call(
|
||||||
|
ApiStvAbschlusspruefung.addNewAbschlusspruefung({
|
||||||
|
uid: student,
|
||||||
|
formData: this.formData
|
||||||
|
})
|
||||||
|
);
|
||||||
|
arraySuccessfullySent.push(student);
|
||||||
|
} catch (error) {
|
||||||
|
arrayError.push(student);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (arraySuccessfullySent.length) {
|
||||||
|
this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave'));
|
||||||
|
//TODO(Manu) check if really needed in case of success
|
||||||
|
//this.$fhcAlert.alertSuccess(this.$p.t('ui', 'successSave') + ': Uids: ' + arraySuccessfullySent.join(", "));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arrayError.length) {
|
||||||
|
this.$fhcAlert.alertError(this.$p.t('ui', 'errorSavingData') + ': Uids: ' + arrayError.join(", "));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (arraySuccessfullySent.length) {
|
||||||
|
this.saveOrUpdateLocalStorage();
|
||||||
|
this.hideModal("finalexamModal");
|
||||||
|
this.resetForm();
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
this.$fhcAlert.handleSystemError(error);
|
||||||
|
}
|
||||||
|
},
|
||||||
hideModal(modalRef){
|
hideModal(modalRef){
|
||||||
this.$refs[modalRef].hide();
|
this.$refs[modalRef].hide();
|
||||||
},
|
},
|
||||||
@@ -376,6 +493,9 @@ export default {
|
|||||||
id: abschlusspruefung_id,
|
id: abschlusspruefung_id,
|
||||||
formData: this.formData
|
formData: this.formData
|
||||||
};
|
};
|
||||||
|
//uncomment if also save data in local storage for update
|
||||||
|
//this.saveOrUpdateLocalStorage();
|
||||||
|
|
||||||
return this.$refs.formFinalExam
|
return this.$refs.formFinalExam
|
||||||
.call(ApiStvAbschlusspruefung.updateAbschlusspruefung(dataToSend))
|
.call(ApiStvAbschlusspruefung.updateAbschlusspruefung(dataToSend))
|
||||||
.then(response => {
|
.then(response => {
|
||||||
@@ -417,7 +537,6 @@ export default {
|
|||||||
this.selectedPruefer1 = null;
|
this.selectedPruefer1 = null;
|
||||||
this.selectedPruefer2 = null;
|
this.selectedPruefer2 = null;
|
||||||
this.selectedPruefer3 = null;
|
this.selectedPruefer3 = null;
|
||||||
|
|
||||||
},
|
},
|
||||||
setDefaultFormData() {
|
setDefaultFormData() {
|
||||||
|
|
||||||
@@ -471,29 +590,29 @@ export default {
|
|||||||
searchPerson(event) {
|
searchPerson(event) {
|
||||||
if (this.abortController.persons) {
|
if (this.abortController.persons) {
|
||||||
this.abortController.persons.abort();
|
this.abortController.persons.abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.abortController.persons = new AbortController();
|
this.abortController.persons = new AbortController();
|
||||||
|
|
||||||
return this.$api
|
return this.$api
|
||||||
.call(ApiStvAbschlusspruefung.getPruefer(event.query))
|
.call(ApiStvAbschlusspruefung.getPruefer(event.query))
|
||||||
.then(result => {
|
.then(result => {
|
||||||
this.filteredPersons = [];
|
this.filteredPersons = [];
|
||||||
for (let person of result.data.retval) {
|
for (let person of result.data.retval) {
|
||||||
this.filteredPersons.push(
|
this.filteredPersons.push(
|
||||||
{
|
{
|
||||||
label: this.getPersonLabel(
|
label: this.getPersonLabel(
|
||||||
person.titelpre,
|
person.titelpre,
|
||||||
person.nachname,
|
person.nachname,
|
||||||
person.vorname,
|
person.vorname,
|
||||||
person.titelpost,
|
person.titelpost,
|
||||||
person.person_uid
|
person.uid
|
||||||
),
|
),
|
||||||
person_id: person.person_id
|
person_id: person.person_id,
|
||||||
}
|
mitarbeiter_uid: person.uid
|
||||||
);
|
}
|
||||||
}
|
);
|
||||||
});
|
}
|
||||||
|
});
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
@@ -526,7 +645,7 @@ export default {
|
|||||||
.catch(this.$fhcAlert.handleSystemError);
|
.catch(this.$fhcAlert.handleSystemError);
|
||||||
|
|
||||||
this.$api
|
this.$api
|
||||||
.call(ApiStvAbschlusspruefung.getAkadGrade(this.student.studiengang_kz))
|
.call(ApiStvAbschlusspruefung.getAkadGrade(this.stg_kz))
|
||||||
.then(result => {
|
.then(result => {
|
||||||
this.arrAkadGrad = result.data;
|
this.arrAkadGrad = result.data;
|
||||||
})
|
})
|
||||||
@@ -547,7 +666,8 @@ export default {
|
|||||||
<div class="stv-details-abschlusspruefung h-100 pb-3">
|
<div class="stv-details-abschlusspruefung h-100 pb-3">
|
||||||
<h4>{{this.$p.t('stv','tab_finalexam')}}</h4>
|
<h4>{{this.$p.t('stv','tab_finalexam')}}</h4>
|
||||||
|
|
||||||
<div v-if="this.student.length">
|
<div v-if="this.student.length" class="d-flex gap-2">
|
||||||
|
<button class="btn btn-primary" @click="actionNewAbschlusspruefung()"> + {{$p.t('stv', 'tab_finalexam')}}</button>
|
||||||
<abschlusspruefung-dropdown
|
<abschlusspruefung-dropdown
|
||||||
:showAllFormats="showAllFormats"
|
:showAllFormats="showAllFormats"
|
||||||
:studentUids="studentUids"
|
:studentUids="studentUids"
|
||||||
@@ -579,12 +699,19 @@ export default {
|
|||||||
<template #title>
|
<template #title>
|
||||||
<p v-if="statusNew" class="fw-bold mt-3">{{$p.t('abschlusspruefung', 'abschluessPruefungAnlegen')}}</p>
|
<p v-if="statusNew" class="fw-bold mt-3">{{$p.t('abschlusspruefung', 'abschluessPruefungAnlegen')}}</p>
|
||||||
<p v-else class="fw-bold mt-3">{{$p.t('abschlusspruefung', 'abschluessPruefungBearbeiten')}}</p>
|
<p v-else class="fw-bold mt-3">{{$p.t('abschlusspruefung', 'abschluessPruefungBearbeiten')}}</p>
|
||||||
|
<div
|
||||||
|
v-if="this.student.length"
|
||||||
|
class="stv-details-abschlusspruefung-student-names"
|
||||||
|
>
|
||||||
|
<small class="text-muted">{{studentNames}}</small>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<form-form v-if="!this.student.length" ref="formFinalExam" @submit.prevent>
|
<form-form ref="formFinalExam" @submit.prevent>
|
||||||
|
|
||||||
<legend>{{this.$p.t('global','details')}}</legend>
|
<legend>{{this.$p.t('global','details')}}</legend>
|
||||||
<p v-if="statusNew">[{{$p.t('ui', 'neu')}}]</p>
|
<p v-if="statusNew">[{{$p.t('ui', 'neu')}}]</p>
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<form-input
|
<form-input
|
||||||
container-class="col-6 stv-details-abschlusspruefung-typ"
|
container-class="col-6 stv-details-abschlusspruefung-typ"
|
||||||
@@ -602,6 +729,7 @@ export default {
|
|||||||
</option>
|
</option>
|
||||||
</form-input>
|
</form-input>
|
||||||
<form-input
|
<form-input
|
||||||
|
v-if="!this.student.length"
|
||||||
container-class="col-6 stv-details-abschlusspruefung-note"
|
container-class="col-6 stv-details-abschlusspruefung-note"
|
||||||
:label="$p.t('abschlusspruefung', 'notekommpruefung')"
|
:label="$p.t('abschlusspruefung', 'notekommpruefung')"
|
||||||
type="select"
|
type="select"
|
||||||
@@ -670,9 +798,10 @@ export default {
|
|||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<form-input
|
<form-input
|
||||||
|
v-if="!this.student.length"
|
||||||
container-class="col-6 stv-details-abschlusspruefung-abschlussbeurteilung_kurzbz"
|
container-class="col-6 stv-details-abschlusspruefung-abschlussbeurteilung_kurzbz"
|
||||||
:label="$p.t('abschlusspruefung', 'abschlussbeurteilung')"
|
:label="$p.t('abschlusspruefung', 'abschlussbeurteilung')"
|
||||||
type="select"
|
type="select"
|
||||||
@@ -698,7 +827,23 @@ export default {
|
|||||||
optionValue="person_id"
|
optionValue="person_id"
|
||||||
dropdown
|
dropdown
|
||||||
forceSelection
|
forceSelection
|
||||||
:suggestions="filteredPersons"
|
:suggestions="filteredPersons"
|
||||||
|
@complete="searchPerson"
|
||||||
|
:min-length="3"
|
||||||
|
>
|
||||||
|
</form-input>
|
||||||
|
<form-input
|
||||||
|
v-if="this.student.length"
|
||||||
|
type="autocomplete"
|
||||||
|
container-class="col-6 stv-details-abschlusspruefung-pruefer3"
|
||||||
|
:label="$p.t('abschlusspruefung', 'pruefer3')"
|
||||||
|
name="pruefer3"
|
||||||
|
v-model="selectedPruefer3"
|
||||||
|
optionLabel="label"
|
||||||
|
optionValue="person_id"
|
||||||
|
dropdown
|
||||||
|
forceSelection
|
||||||
|
:suggestions="filteredPersons"
|
||||||
@complete="searchPerson"
|
@complete="searchPerson"
|
||||||
:min-length="3"
|
:min-length="3"
|
||||||
>
|
>
|
||||||
@@ -722,6 +867,7 @@ export default {
|
|||||||
</option>
|
</option>
|
||||||
</form-input>
|
</form-input>
|
||||||
<form-input
|
<form-input
|
||||||
|
v-if="!this.student.length"
|
||||||
type="autocomplete"
|
type="autocomplete"
|
||||||
container-class="col-6 stv-details-abschlusspruefung-pruefer3"
|
container-class="col-6 stv-details-abschlusspruefung-pruefer3"
|
||||||
:label="$p.t('abschlusspruefung', 'pruefer3')"
|
:label="$p.t('abschlusspruefung', 'pruefer3')"
|
||||||
@@ -731,7 +877,7 @@ export default {
|
|||||||
optionValue="person_id"
|
optionValue="person_id"
|
||||||
dropdown
|
dropdown
|
||||||
forceSelection
|
forceSelection
|
||||||
:suggestions="filteredPersons"
|
:suggestions="filteredPersons"
|
||||||
@complete="searchPerson"
|
@complete="searchPerson"
|
||||||
:min-length="3"
|
:min-length="3"
|
||||||
>
|
>
|
||||||
@@ -779,6 +925,7 @@ export default {
|
|||||||
>
|
>
|
||||||
</form-input>
|
</form-input>
|
||||||
<form-input
|
<form-input
|
||||||
|
v-if="!this.student.length"
|
||||||
container-class="col-6 stv-details-abschlusspruefung-protokoll"
|
container-class="col-6 stv-details-abschlusspruefung-protokoll"
|
||||||
:label="$p.t('abschlusspruefung', 'protokoll')"
|
:label="$p.t('abschlusspruefung', 'protokoll')"
|
||||||
type="textarea"
|
type="textarea"
|
||||||
@@ -790,7 +937,7 @@ export default {
|
|||||||
</form-input>
|
</form-input>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row mb-3 col-6">
|
<div v-if="!this.student.length" class="row mb-3 col-6">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<p >{{$p.t('abschlusspruefung', 'zurBeurteilung')}}</p>
|
<p >{{$p.t('abschlusspruefung', 'zurBeurteilung')}}</p>
|
||||||
</div>
|
</div>
|
||||||
@@ -807,8 +954,9 @@ export default {
|
|||||||
|
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">{{$p.t('ui', 'abbrechen')}}</button>
|
<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="addNewAbschlusspruefung()"> {{$p.t('ui', 'speichern')}}</button>
|
<button v-if="statusNew && !this.student.length" class="btn btn-primary" @click="addNewAbschlusspruefung()"> {{$p.t('ui', 'speichern')}}</button>
|
||||||
<button v-else class="btn btn-primary" @click="updateAbschlusspruefung(formData.abschlusspruefung_id)"> {{$p.t('ui', 'speichern')}}</button>
|
<button v-else-if="statusNew && this.student.length" class="btn btn-primary" @click="addNewAbschlusspruefungMulti(studentUids)"> {{$p.t('ui', 'speichern')}}</button>
|
||||||
|
<button v-else class="btn btn-primary" @click="updateAbschlusspruefung(formData.abschlusspruefung_id)"> {{$p.t('ui', 'speichern')}}</button>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
</bs-modal>
|
</bs-modal>
|
||||||
|
|||||||
-1
@@ -470,7 +470,6 @@ export default {
|
|||||||
:label="$p.t('admission', 'anmeldundRtAm')"
|
:label="$p.t('admission', 'anmeldundRtAm')"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="formData.anmeldedatum"
|
v-model="formData.anmeldedatum"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
auto-apply
|
auto-apply
|
||||||
:enable-time-picker="false"
|
:enable-time-picker="false"
|
||||||
text-input
|
text-input
|
||||||
|
|||||||
@@ -158,6 +158,16 @@ export default {
|
|||||||
},
|
},
|
||||||
reload(){
|
reload(){
|
||||||
this.updateStudent(this.modelValue);
|
this.updateStudent(this.modelValue);
|
||||||
|
},
|
||||||
|
sendInfomail(){
|
||||||
|
const subject = this.$p.t('person', 'betreffProfilfoto');
|
||||||
|
const subjectEncoded = encodeURIComponent(subject);
|
||||||
|
|
||||||
|
const body = this.$p.t('person', 'mailText_profilfoto');
|
||||||
|
const bodyWithNewLines = body.replace(/\\n/g, '\n');
|
||||||
|
const bodyEncoded = encodeURIComponent(bodyWithNewLines);
|
||||||
|
|
||||||
|
window.location.href = "mailto:" + this.modelValue.mail_intern + "?subject=" + subjectEncoded + "&body=" + bodyEncoded;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
@@ -293,7 +303,6 @@ export default {
|
|||||||
:label="$p.t('person', 'geburtsdatum')"
|
:label="$p.t('person', 'geburtsdatum')"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="data.gebdatum"
|
v-model="data.gebdatum"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="gebdatum"
|
name="gebdatum"
|
||||||
:clearable="false"
|
:clearable="false"
|
||||||
no-today
|
no-today
|
||||||
@@ -387,8 +396,10 @@ export default {
|
|||||||
container-class="col stv-details-details-foto"
|
container-class="col stv-details-details-foto"
|
||||||
:label="$p.t('person', 'foto')"
|
:label="$p.t('person', 'foto')"
|
||||||
type="UploadImage"
|
type="UploadImage"
|
||||||
|
titleActionButton="Infomail"
|
||||||
v-model="data.foto"
|
v-model="data.foto"
|
||||||
name="foto"
|
name="foto"
|
||||||
|
@actionbutton-clicked="sendInfomail"
|
||||||
>
|
>
|
||||||
<img alt="No Image" :src="noImageSrc" class="w-100">
|
<img alt="No Image" :src="noImageSrc" class="w-100">
|
||||||
</form-input>
|
</form-input>
|
||||||
|
|||||||
@@ -103,7 +103,6 @@ export default {
|
|||||||
<form-input
|
<form-input
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="formData.nachgereicht_am"
|
v-model="formData.nachgereicht_am"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="nachgereicht_am"
|
name="nachgereicht_am"
|
||||||
:label="$p.t('dokumente/nachreichungAm')"
|
:label="$p.t('dokumente/nachreichungAm')"
|
||||||
auto-apply
|
auto-apply
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export default {
|
|||||||
return {
|
return {
|
||||||
filter: false,
|
filter: false,
|
||||||
studiengang_kz: false,
|
studiengang_kz: false,
|
||||||
counterdate: luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate()
|
counterdate: new Date()
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -259,7 +259,6 @@ export default {
|
|||||||
<form-input
|
<form-input
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="counterdate"
|
v-model="counterdate"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
input-group
|
input-group
|
||||||
:enable-time-picker="false"
|
:enable-time-picker="false"
|
||||||
text-input
|
text-input
|
||||||
|
|||||||
@@ -79,7 +79,6 @@ export default {
|
|||||||
<form-input
|
<form-input
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="data.buchungsdatum"
|
v-model="data.buchungsdatum"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="buchungsdatum"
|
name="buchungsdatum"
|
||||||
:label="$p.t('konto/buchungsdatum')"
|
:label="$p.t('konto/buchungsdatum')"
|
||||||
:enable-time-picker="false"
|
:enable-time-picker="false"
|
||||||
|
|||||||
@@ -88,7 +88,7 @@ export default {
|
|||||||
this.data = {
|
this.data = {
|
||||||
buchungstyp_kurzbz: '',
|
buchungstyp_kurzbz: '',
|
||||||
betrag: '-0.00',
|
betrag: '-0.00',
|
||||||
buchungsdatum: luxon.DateTime.now().setZone(FHC_JS_DATA_STORAGE_OBJECT.timezone).toISODate(),
|
buchungsdatum: new Date(),
|
||||||
buchungstext: '',
|
buchungstext: '',
|
||||||
mahnspanne: 30,
|
mahnspanne: 30,
|
||||||
studiensemester_kurzbz: this.currentSemester,
|
studiensemester_kurzbz: this.currentSemester,
|
||||||
@@ -154,7 +154,6 @@ export default {
|
|||||||
<form-input
|
<form-input
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="data.buchungsdatum"
|
v-model="data.buchungsdatum"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="buchungsdatum"
|
name="buchungsdatum"
|
||||||
:label="$p.t('konto/buchungsdatum')"
|
:label="$p.t('konto/buchungsdatum')"
|
||||||
:enable-time-picker="false"
|
:enable-time-picker="false"
|
||||||
|
|||||||
@@ -467,7 +467,6 @@ export default {
|
|||||||
:label="$p.t('ui', 'von')"
|
:label="$p.t('ui', 'von')"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="formData.von"
|
v-model="formData.von"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
auto-apply
|
auto-apply
|
||||||
:enable-time-picker="false"
|
:enable-time-picker="false"
|
||||||
text-input
|
text-input
|
||||||
@@ -502,7 +501,6 @@ export default {
|
|||||||
:label="$p.t('global', 'bis')"
|
:label="$p.t('global', 'bis')"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="formData.bis"
|
v-model="formData.bis"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
auto-apply
|
auto-apply
|
||||||
:enable-time-picker="false"
|
:enable-time-picker="false"
|
||||||
text-input
|
text-input
|
||||||
|
|||||||
@@ -325,7 +325,6 @@ export default {
|
|||||||
:label="$p.t('infocenter', 'zgvDatum')"
|
:label="$p.t('infocenter', 'zgvDatum')"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="data.zgvdatum"
|
v-model="data.zgvdatum"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="zgvdatum"
|
name="zgvdatum"
|
||||||
no-today
|
no-today
|
||||||
auto-apply
|
auto-apply
|
||||||
@@ -390,7 +389,6 @@ export default {
|
|||||||
:label="$p.t('lehre', 'zgvMasterDatum')"
|
:label="$p.t('lehre', 'zgvMasterDatum')"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="data.zgvmadatum"
|
v-model="data.zgvmadatum"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="zgvmadatum"
|
name="zgvmadatum"
|
||||||
no-today
|
no-today
|
||||||
auto-apply
|
auto-apply
|
||||||
@@ -456,7 +454,6 @@ export default {
|
|||||||
:label="$p.t('lehre', 'zgvDoktorDatum')"
|
:label="$p.t('lehre', 'zgvDoktorDatum')"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="data.zgvdoktordatum"
|
v-model="data.zgvdoktordatum"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="zgvdoktordatum"
|
name="zgvdoktordatum"
|
||||||
no-today
|
no-today
|
||||||
auto-apply
|
auto-apply
|
||||||
|
|||||||
@@ -276,7 +276,6 @@ export default{
|
|||||||
container-class="mb-3"
|
container-class="mb-3"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="formData.datum"
|
v-model="formData.datum"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="datum"
|
name="datum"
|
||||||
:label="$p.t('global/datum')"
|
:label="$p.t('global/datum')"
|
||||||
auto-apply
|
auto-apply
|
||||||
@@ -292,7 +291,6 @@ export default{
|
|||||||
container-class="mb-3"
|
container-class="mb-3"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="formData.bestaetigtam"
|
v-model="formData.bestaetigtam"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
name="bestaetigtam"
|
name="bestaetigtam"
|
||||||
:label="$p.t('lehre/bestaetigt_am')"
|
:label="$p.t('lehre/bestaetigt_am')"
|
||||||
auto-apply
|
auto-apply
|
||||||
@@ -308,14 +306,13 @@ export default{
|
|||||||
container-class="mb-3"
|
container-class="mb-3"
|
||||||
type="DatePicker"
|
type="DatePicker"
|
||||||
v-model="formData.bewerbung_abgeschicktamum"
|
v-model="formData.bewerbung_abgeschicktamum"
|
||||||
model-type="yyyy-MM-dd HH:mm:ss"
|
|
||||||
name="bewerbung_abgeschicktamum"
|
name="bewerbung_abgeschicktamum"
|
||||||
:label="$p.t('lehre/bewerbung_abgeschickt_am')"
|
:label="$p.t('lehre/bewerbung_abgeschickt_am')"
|
||||||
auto-apply
|
auto-apply
|
||||||
:enable-time-picker="true"
|
:enable-time-picker="false"
|
||||||
format="dd.MM.yyyy HH:mm:ss"
|
format="dd.MM.yyyy"
|
||||||
text-input
|
text-input
|
||||||
preview-format="dd.MM.yyyy HH:mm:ss"
|
preview-format="dd.MM.yyyy"
|
||||||
:teleport="true"
|
:teleport="true"
|
||||||
:disabled="bisLocked || !hasPrestudentstatusPermission"
|
:disabled="bisLocked || !hasPrestudentstatusPermission"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -93,7 +93,7 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
{title:"Geschlecht", field:"geschlecht", headerFilter: "list", headerFilterParams: {values:{'m':'männlich','w':'weiblich','x':'divers','u':'unbekannt'}, listOnEmpty:true, autocomplete:true}},
|
{title:"Geschlecht", field:"geschlecht", headerFilter: "list", headerFilterParams: {values:{'m':'männlich','w':'weiblich','x':'divers','u':'unbekannt'}, listOnEmpty:true, autocomplete:true}},
|
||||||
{title:"Sem.", field:"semester", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}},
|
{title: "Sem.", field:"semester_berechnet", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}},
|
||||||
{title:"Verb.", field:"verband", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}},
|
{title:"Verb.", field:"verband", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}},
|
||||||
{title:"Grp.", field:"gruppe", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}},
|
{title:"Grp.", field:"gruppe", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}},
|
||||||
{title:"Studiengang", field:"studiengang", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}},
|
{title:"Studiengang", field:"studiengang", headerFilter: "list", headerFilterParams: {valuesLookup:true, listOnEmpty:true, autocomplete:true, sort:"asc"}},
|
||||||
@@ -171,7 +171,7 @@ export default {
|
|||||||
selectableRows: true,
|
selectableRows: true,
|
||||||
selectableRowsRangeMode: 'click',
|
selectableRowsRangeMode: 'click',
|
||||||
index: 'prestudent_id',
|
index: 'prestudent_id',
|
||||||
persistenceID: 'stv-list',
|
persistenceID: 'stv-list-20260223_01'
|
||||||
},
|
},
|
||||||
tabulatorEvents: [
|
tabulatorEvents: [
|
||||||
{
|
{
|
||||||
@@ -195,7 +195,15 @@ export default {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
event: 'dataLoaded',
|
event: 'dataLoaded',
|
||||||
handler: data => this.count = data.length
|
handler: data => {
|
||||||
|
if (Array.isArray(data)) {
|
||||||
|
this.count = data.length;
|
||||||
|
this.allPrestudents = data.map(item => item.prestudent_id);
|
||||||
|
} else {
|
||||||
|
this.count = 0;
|
||||||
|
this.allPrestudents = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
event: 'dataFiltered',
|
event: 'dataFiltered',
|
||||||
@@ -237,7 +245,8 @@ export default {
|
|||||||
dragSource: [],
|
dragSource: [],
|
||||||
oldScrollUrl: '',
|
oldScrollUrl: '',
|
||||||
oldScrollLeft: 0,
|
oldScrollLeft: 0,
|
||||||
oldScrollTop: 0
|
oldScrollTop: 0,
|
||||||
|
allPrestudents: []
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -282,8 +291,9 @@ export default {
|
|||||||
options: {
|
options: {
|
||||||
delimiter: ';',
|
delimiter: ';',
|
||||||
bom: true,
|
bom: true,
|
||||||
}
|
},
|
||||||
}
|
rowRange: this.selectedcount > 0 ? "selected" : "all",
|
||||||
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
fileString() {
|
fileString() {
|
||||||
@@ -291,8 +301,24 @@ export default {
|
|||||||
.replace(/\//g, '_');
|
.replace(/\//g, '_');
|
||||||
return "StudentList_" + today + ".csv";
|
return "StudentList_" + today + ".csv";
|
||||||
},
|
},
|
||||||
|
selectedPrestudents() {
|
||||||
|
if (this.selected && this.selected.length > 0) {
|
||||||
|
return this.selected.map(item => item.prestudent_id);
|
||||||
|
} else {
|
||||||
|
// fallback whole list of prestudents
|
||||||
|
return this.allPrestudents || [];
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
linkXLS(){
|
||||||
|
return FHC_JS_DATA_STORAGE_OBJECT.app_root
|
||||||
|
+ 'content/statistik/studentenexportextended.xls.php?'
|
||||||
|
+ '&studiensemester_kurzbz=' + this.currentSemester
|
||||||
|
+ '&data=' + this.selectedPrestudents.join(";");
|
||||||
|
},
|
||||||
},
|
},
|
||||||
created: function() {
|
created: function() {
|
||||||
|
|
||||||
if(this.tagsEnabled) {
|
if(this.tagsEnabled) {
|
||||||
const coltags = {
|
const coltags = {
|
||||||
title: 'Tags',
|
title: 'Tags',
|
||||||
@@ -312,7 +338,7 @@ export default {
|
|||||||
if (n !== o && o !== undefined && this.$refs.table.tableBuilt) {
|
if (n !== o && o !== undefined && this.$refs.table.tableBuilt) {
|
||||||
this.translateTabulator();
|
this.translateTabulator();
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
translateTabulator() {
|
translateTabulator() {
|
||||||
@@ -330,7 +356,7 @@ export default {
|
|||||||
ersatzkennzeichen: capitalize(this.$p.t('person/ersatzkennzeichen')),
|
ersatzkennzeichen: capitalize(this.$p.t('person/ersatzkennzeichen')),
|
||||||
gebdatum: capitalize(this.$p.t('person/geburtsdatum')),
|
gebdatum: capitalize(this.$p.t('person/geburtsdatum')),
|
||||||
geschlecht: capitalize(this.$p.t('person/geschlecht')),
|
geschlecht: capitalize(this.$p.t('person/geschlecht')),
|
||||||
semester: capitalize(this.$p.t('lehre/sem')),
|
semester_berechnet: capitalize(this.$p.t('lehre/sem')),
|
||||||
verband: capitalize(this.$p.t('lehre/verb')),
|
verband: capitalize(this.$p.t('lehre/verb')),
|
||||||
gruppe: capitalize(this.$p.t('lehre/grp')),
|
gruppe: capitalize(this.$p.t('lehre/grp')),
|
||||||
studiengang: capitalize(this.$p.t('lehre/studiengang')),
|
studiengang: capitalize(this.$p.t('lehre/studiengang')),
|
||||||
@@ -391,15 +417,27 @@ export default {
|
|||||||
actionNewPrestudent() {
|
actionNewPrestudent() {
|
||||||
this.$refs.new.open();
|
this.$refs.new.open();
|
||||||
},
|
},
|
||||||
rowSelectionChanged(data, rows) {
|
rowSelectionChanged(data, rows, selected, deselected) {
|
||||||
this.selectedcount = data.length;
|
this.selectedcount = data.length;
|
||||||
this.lastSelected = this.selected;
|
|
||||||
|
|
||||||
//for tags
|
//in case of empty selection (eg. in future or past semester of selected student without sem)
|
||||||
this.selectedRows = this.$refs.table.tabulator.getSelectedRows();
|
if(selected.length == 0 ) {
|
||||||
this.selectedColumnValues = this.selectedRows.filter(row => row.getData().prestudent_id !== undefined && row.getData().prestudent_id).map(row => row.getData().prestudent_id);
|
this.lastSelected = this.selected;
|
||||||
|
}
|
||||||
|
|
||||||
this.$emit('update:selected', data);
|
if(selected.length > 0 || deselected.length > 0){
|
||||||
|
|
||||||
|
//for tags
|
||||||
|
this.selectedRows = this.$refs.table.tabulator.getSelectedRows();
|
||||||
|
this.selectedColumnValues = this.selectedRows.filter(
|
||||||
|
row => row.getData().prestudent_id !== undefined
|
||||||
|
&& row.getData().prestudent_id
|
||||||
|
).map(
|
||||||
|
row => row.getData().prestudent_id
|
||||||
|
);
|
||||||
|
|
||||||
|
this.$emit('update:selected', data);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
autoSelectRows(data) {
|
autoSelectRows(data) {
|
||||||
if (Array.isArray(this.lastSelected) && this.lastSelected.length){
|
if (Array.isArray(this.lastSelected) && this.lastSelected.length){
|
||||||
@@ -476,6 +514,14 @@ export default {
|
|||||||
this.$reloadList();
|
this.$reloadList();
|
||||||
},
|
},
|
||||||
onKeydown(e) { // TODO(chris): this should be in the filter component
|
onKeydown(e) { // TODO(chris): this should be in the filter component
|
||||||
|
|
||||||
|
if ((e.ctrlKey || e.metaKey) && e.code === "KeyA") {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
this.$refs.table.tabulator.deselectRow();
|
||||||
|
this.$refs.table.tabulator.selectRow();
|
||||||
|
}
|
||||||
|
|
||||||
if (!this.focusObj)
|
if (!this.focusObj)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -546,6 +592,10 @@ export default {
|
|||||||
this.changeFocus(this.focusObj, el);
|
this.changeFocus(this.focusObj, el);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
clearSelection(){
|
||||||
|
this.lastSelected = [];
|
||||||
|
this.$emit('update:selected',[]);
|
||||||
|
},
|
||||||
//methods tags
|
//methods tags
|
||||||
addedTag(addedTag)
|
addedTag(addedTag)
|
||||||
{
|
{
|
||||||
@@ -627,6 +677,27 @@ export default {
|
|||||||
@headerFilterOn="handleHeaderFilter"
|
@headerFilterOn="handleHeaderFilter"
|
||||||
>
|
>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<template #actions>
|
||||||
|
<div>
|
||||||
|
<button
|
||||||
|
class="btn btn-outline-success sm mb-1"
|
||||||
|
:title="'Export ' + selectedPrestudents.length + ' prestudent(s) to Excel'"
|
||||||
|
>
|
||||||
|
<i class="fas fa-file-excel fa-xl"></i>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<template #additional>
|
||||||
|
<div class="pe-2">
|
||||||
|
<a :href="linkXLS" target="_blank">
|
||||||
|
<i class="fas fa-file-excel fa-xl text-success" :title="$p.t('stv', 'text_exportXLS', { count: selectedPrestudents.length })"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<template #actions>
|
<template #actions>
|
||||||
<core-tag ref="tagComponent"
|
<core-tag ref="tagComponent"
|
||||||
v-if="tagsEnabled"
|
v-if="tagsEnabled"
|
||||||
@@ -637,22 +708,23 @@ export default {
|
|||||||
@updated="updatedTag"
|
@updated="updatedTag"
|
||||||
zuordnung_typ="prestudent_id"
|
zuordnung_typ="prestudent_id"
|
||||||
></core-tag>
|
></core-tag>
|
||||||
</template>
|
|
||||||
|
|
||||||
<template #actions v-if="filter.length || headerFilterActive">
|
<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">
|
<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">
|
<p class="text-danger mb-0">
|
||||||
<strong>{{$p.t('filter','filterActive')}}</strong>
|
<strong>{{$p.t('filter','filterActive')}}</strong>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<button
|
||||||
|
class="btn btn-outline-danger sm"
|
||||||
|
:title="$p.t('filter/filterDelete')"
|
||||||
|
@click="resetFilter"
|
||||||
|
>
|
||||||
|
<span class="fa-solid fa-filter-circle-xmark"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<button
|
|
||||||
class="btn btn-outline-danger sm"
|
|
||||||
:title="$p.t('filter/filterDelete')"
|
|
||||||
@click="resetFilter"
|
|
||||||
>
|
|
||||||
<span class="fa-solid fa-filter-circle-xmark"></span>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #filter>
|
<template #filter>
|
||||||
|
|||||||
@@ -285,7 +285,6 @@ export default {
|
|||||||
uid="stv-list-new-gebdatum"
|
uid="stv-list-new-gebdatum"
|
||||||
name="gebdatum"
|
name="gebdatum"
|
||||||
v-model="formDataPerson['gebdatum']"
|
v-model="formDataPerson['gebdatum']"
|
||||||
model-type="yyyy-MM-dd"
|
|
||||||
:disabled="!!person"
|
:disabled="!!person"
|
||||||
@update:model-value="loadSuggestions"
|
@update:model-value="loadSuggestions"
|
||||||
text-input
|
text-input
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import FormInput from "../Form/Input.js";
|
|||||||
import BsModal from '../Bootstrap/Modal.js';
|
import BsModal from '../Bootstrap/Modal.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
name: 'TagComponent',
|
||||||
components: {
|
components: {
|
||||||
CoreForm,
|
CoreForm,
|
||||||
FormInput,
|
FormInput,
|
||||||
@@ -44,7 +45,9 @@ export default {
|
|||||||
insertvon: "",
|
insertvon: "",
|
||||||
updateamum: "",
|
updateamum: "",
|
||||||
updatevon: "",
|
updatevon: "",
|
||||||
response: ""
|
response: "",
|
||||||
|
start: "",
|
||||||
|
ende: ""
|
||||||
},
|
},
|
||||||
mode: "create"
|
mode: "create"
|
||||||
};
|
};
|
||||||
@@ -87,6 +90,10 @@ export default {
|
|||||||
this.tagData.bearbeiter = item.bearbeiter;
|
this.tagData.bearbeiter = item.bearbeiter;
|
||||||
this.tagData.verfasser = item.verfasser;
|
this.tagData.verfasser = item.verfasser;
|
||||||
this.tagData.readonly = item.readonly;
|
this.tagData.readonly = item.readonly;
|
||||||
|
//add for automated tags
|
||||||
|
this.tagData.automatisiert = item.automatisiert;
|
||||||
|
this.tagData.start = this.formatDateTimeDay(item.start);
|
||||||
|
this.tagData.ende = this.formatDateTimeDay(item.ende);
|
||||||
|
|
||||||
if (item && item.notiz_id)
|
if (item && item.notiz_id)
|
||||||
{
|
{
|
||||||
@@ -201,6 +208,14 @@ export default {
|
|||||||
second: "2-digit"
|
second: "2-digit"
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
formatDateTimeDay: (dateString) => {
|
||||||
|
if (!dateString) return null;
|
||||||
|
return new Date(dateString).toLocaleString('de-AT', {
|
||||||
|
year: "numeric",
|
||||||
|
month: "2-digit",
|
||||||
|
day: "2-digit",
|
||||||
|
});
|
||||||
|
},
|
||||||
async copy (){
|
async copy (){
|
||||||
await navigator.clipboard.writeText(this.tagData.notiz);
|
await navigator.clipboard.writeText(this.tagData.notiz);
|
||||||
}
|
}
|
||||||
@@ -258,6 +273,15 @@ export default {
|
|||||||
<span v-if="tagData.bearbeiter && tagData.insertamum !== tagData.updateamum">
|
<span v-if="tagData.bearbeiter && tagData.insertamum !== tagData.updateamum">
|
||||||
{{ $p.t('notiz', 'tag_bearbeiter', { 0: tagData.bearbeiter, 1: tagData.updateamum }) }}
|
{{ $p.t('notiz', 'tag_bearbeiter', { 0: tagData.bearbeiter, 1: tagData.updateamum }) }}
|
||||||
</span>
|
</span>
|
||||||
|
<span v-if="tagData.start || tagData.ende" >
|
||||||
|
gültig
|
||||||
|
</span>
|
||||||
|
<span v-if="tagData.start">
|
||||||
|
von {{tagData.start}}
|
||||||
|
</span>
|
||||||
|
<span v-if="tagData.ende">
|
||||||
|
bis {{tagData.ende}}
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -0,0 +1,111 @@
|
|||||||
|
export function idTagFormatter (id, tagData, tagComponent, typeId, semesterStart=null, semesterEnd=null)
|
||||||
|
{
|
||||||
|
if (!id) return;
|
||||||
|
|
||||||
|
const hasSemesterFilter = !!(semesterStart && semesterEnd);
|
||||||
|
|
||||||
|
const semStart = hasSemesterFilter ? new Date(semesterStart) : null;
|
||||||
|
const semEnd = hasSemesterFilter ? new Date(semesterEnd) : null;
|
||||||
|
|
||||||
|
const parsedTags = tagData.map(tag => ({
|
||||||
|
id: tag.notiz_id,
|
||||||
|
typ_kurzbz: tag.titel?.toLowerCase(),
|
||||||
|
beschreibung: tag.bezeichnung,
|
||||||
|
notiz: tag.text || "",
|
||||||
|
style: tag.style,
|
||||||
|
done: tag.done,
|
||||||
|
automatisiert: tag.automatisiert,
|
||||||
|
typeId: id,
|
||||||
|
validFrom: tag.start ? new Date(tag.start) : null,
|
||||||
|
validTo: tag.ende ? new Date(tag.ende) : null
|
||||||
|
}));
|
||||||
|
|
||||||
|
const isInSemester = (tag) => {
|
||||||
|
if (!hasSemesterFilter) return true;
|
||||||
|
|
||||||
|
if (!tag.validFrom && !tag.validTo) return true;
|
||||||
|
|
||||||
|
if (!tag.validFrom && !tag.validTo) return true;
|
||||||
|
|
||||||
|
if (tag.validFrom && tag.validTo) {
|
||||||
|
return tag.validFrom <= semEnd && tag.validTo >= semStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tag.validFrom && !tag.validTo) {
|
||||||
|
return tag.validFrom <= semEnd;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tag.validFrom && tag.validTo) {
|
||||||
|
return tag.validTo >= semStart;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
let container = document.createElement('div');
|
||||||
|
container.className = "d-flex gap-1";
|
||||||
|
|
||||||
|
let maxVisibleTags = 5;
|
||||||
|
let expanded = false;
|
||||||
|
const renderTags = () => {
|
||||||
|
container.innerHTML = '';
|
||||||
|
|
||||||
|
let filtered = parsedTags
|
||||||
|
.filter(t => t != null)
|
||||||
|
.filter(isInSemester);
|
||||||
|
|
||||||
|
filtered.sort((a, b) => {
|
||||||
|
let adone = a.done ? 1 : 0;
|
||||||
|
let bdone = b.done ? 1 : 0;
|
||||||
|
|
||||||
|
if (adone !== bdone) return adone - bdone;
|
||||||
|
return b.id - a.id;
|
||||||
|
});
|
||||||
|
|
||||||
|
const tagsToShow = expanded
|
||||||
|
? filtered
|
||||||
|
: filtered.slice(0, maxVisibleTags);
|
||||||
|
|
||||||
|
tagsToShow.forEach(tag => {
|
||||||
|
let tagElement = document.createElement('span');
|
||||||
|
|
||||||
|
if(tag.automatisiert)
|
||||||
|
tagElement.innerHTML = "<i class='fa-solid fa-lock'></i> " + tag.beschreibung;
|
||||||
|
else
|
||||||
|
tagElement.innerText = tag.beschreibung;
|
||||||
|
tagElement.title = tag.notiz;
|
||||||
|
tagElement.className = "tag " + tag.style;
|
||||||
|
|
||||||
|
if (tag.done) {
|
||||||
|
tagElement.className += " tag_done";
|
||||||
|
}
|
||||||
|
if (tag.automatisiert)
|
||||||
|
tagElement.className += " tag_auto";
|
||||||
|
|
||||||
|
tagElement.addEventListener('click', (event) => {
|
||||||
|
event.stopPropagation();
|
||||||
|
event.preventDefault();
|
||||||
|
tagComponent.editTag(tag.id);
|
||||||
|
});
|
||||||
|
|
||||||
|
container.appendChild(tagElement);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (filtered.length > maxVisibleTags) {
|
||||||
|
let toggle = document.createElement('button');
|
||||||
|
toggle.innerText = (expanded ? '- ' : '+ ') + (filtered.length - maxVisibleTags);
|
||||||
|
toggle.className = "display_all";
|
||||||
|
|
||||||
|
toggle.addEventListener('click', () => {
|
||||||
|
expanded = !expanded;
|
||||||
|
renderTags();
|
||||||
|
});
|
||||||
|
|
||||||
|
container.appendChild(toggle);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
renderTags();
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
@@ -4,7 +4,6 @@ import FormInput from '../Form/Input.js';
|
|||||||
import ApiUdf from '../../api/udf.js';
|
import ApiUdf from '../../api/udf.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'CoreUdfCmpt',
|
|
||||||
components: {
|
components: {
|
||||||
CoreFetchCmpt,
|
CoreFetchCmpt,
|
||||||
FormInput
|
FormInput
|
||||||
@@ -27,8 +26,7 @@ export default {
|
|||||||
// The values as associative array
|
// The values as associative array
|
||||||
modelValue: Object,
|
modelValue: Object,
|
||||||
// Show only fields with a name that exists in the filter
|
// Show only fields with a name that exists in the filter
|
||||||
filter: [String, Array],
|
filter: [String, Array]
|
||||||
readonly: true
|
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
@@ -37,13 +35,6 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
isPkValid() {
|
|
||||||
// If the provided pk is _not_ valid
|
|
||||||
return !Object.keys(this.pk).every(key => !this.pk[key]);
|
|
||||||
},
|
|
||||||
getReadonly() {
|
|
||||||
return this.readonly;
|
|
||||||
},
|
|
||||||
filterArray() {
|
filterArray() {
|
||||||
if (!this.filter || Array.isArray(this.filter))
|
if (!this.filter || Array.isArray(this.filter))
|
||||||
return this.filter;
|
return this.filter;
|
||||||
@@ -70,10 +61,6 @@ export default {
|
|||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
pk(n, o) {
|
pk(n, o) {
|
||||||
|
|
||||||
// If the provided pk is _not_ valid
|
|
||||||
if (Object.keys(n).every(key => !n[key])) return;
|
|
||||||
|
|
||||||
if (!this.$refs.fetch)
|
if (!this.$refs.fetch)
|
||||||
return; // NOTE(chris): no initial load yet
|
return; // NOTE(chris): no initial load yet
|
||||||
|
|
||||||
@@ -137,7 +124,6 @@ export default {
|
|||||||
template: `
|
template: `
|
||||||
<div class="core-udf row">
|
<div class="core-udf row">
|
||||||
<core-fetch-cmpt
|
<core-fetch-cmpt
|
||||||
v-if="isPkValid"
|
|
||||||
ref="fetch"
|
ref="fetch"
|
||||||
:api-function="loadF"
|
:api-function="loadF"
|
||||||
:api-function-parameters="{ ciModel, pk }"
|
:api-function-parameters="{ ciModel, pk }"
|
||||||
@@ -152,7 +138,7 @@ export default {
|
|||||||
:type="field.type"
|
:type="field.type"
|
||||||
:multiple="field.multiple"
|
:multiple="field.multiple"
|
||||||
:title="field.description"
|
:title="field.description"
|
||||||
:disabled="field.disabled || getReadonly"
|
:disabled="field.disabled"
|
||||||
:clearable="field.clearable"
|
:clearable="field.clearable"
|
||||||
:auto-apply="field.autoApply"
|
:auto-apply="field.autoApply"
|
||||||
:enable-time-picker="field.enableTimePicker"
|
:enable-time-picker="field.enableTimePicker"
|
||||||
@@ -166,4 +152,4 @@ export default {
|
|||||||
</template>
|
</template>
|
||||||
</core-fetch-cmpt>
|
</core-fetch-cmpt>
|
||||||
</div>`
|
</div>`
|
||||||
}
|
}
|
||||||
@@ -902,6 +902,7 @@ export const CoreFilterCmpt = {
|
|||||||
<span class="fa-solid fa-xl fa-table-columns"></span>
|
<span class="fa-solid fa-xl fa-table-columns"></span>
|
||||||
</a>
|
</a>
|
||||||
<table-download class="btn btn-link px-0 fhc-text" :tabulator="tabulator" :config="download"></table-download>
|
<table-download class="btn btn-link px-0 fhc-text" :tabulator="tabulator" :config="download"></table-download>
|
||||||
|
<slot name="additional"></slot>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -202,7 +202,7 @@ export default {
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
download(config) {
|
download(config) {
|
||||||
this.tabulator.download(config.formatter, config.file, config.options)
|
this.tabulator.download(config.formatter, config.file, config.options, config.rowRange)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
|
|||||||
@@ -0,0 +1,147 @@
|
|||||||
|
export default {
|
||||||
|
name: 'HorizontalSplit',
|
||||||
|
props: {
|
||||||
|
defaultRatio: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [50, 50]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data: function () {
|
||||||
|
return {
|
||||||
|
availWidth: 0,
|
||||||
|
leftwidth: 0,
|
||||||
|
rightwidth: 0,
|
||||||
|
mousePosX: 0,
|
||||||
|
resize: false,
|
||||||
|
hsplitterOffset: 0,
|
||||||
|
selfOffsetLeft: 0
|
||||||
|
};
|
||||||
|
},
|
||||||
|
template: `
|
||||||
|
<div ref="horizontalsplit" class="horizontalsplit-container">
|
||||||
|
<div ref="leftpanel" class="horizontalsplitted"
|
||||||
|
:style="{ width: this.leftwidthcss }">
|
||||||
|
<slot name="left">
|
||||||
|
<p>Left Panel</p>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
|
<div ref="hsplitter" class="horizontalsplitter"
|
||||||
|
:class="this.leftOrRightClass" @mousedown="this.dragStart">
|
||||||
|
<div class="splitactions horizontal" :class="this.leftOrRightClass">
|
||||||
|
<span @click="this.collapseRight" class="splitaction">
|
||||||
|
<i class="fas fa-angle-right text-muted"></i>
|
||||||
|
</span>
|
||||||
|
<span @dblclick="this.showBoth" class="splitaction resize">
|
||||||
|
<i class="fas fa-grip-lines-vertical text-muted"></i>
|
||||||
|
</span>
|
||||||
|
<span @click="this.collapseLeft" class="splitaction">
|
||||||
|
<i class="fas fa-angle-left text-muted"></i>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div ref="rightpanel" class="horizontalsplitted"
|
||||||
|
:style="{ width: this.rightwidthcss }">
|
||||||
|
<slot name="right">
|
||||||
|
<p/>
|
||||||
|
</slot>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`,
|
||||||
|
mounted: function () {
|
||||||
|
this.calcWidths();
|
||||||
|
this.trackHorizontalSplitterOffsetLeft();
|
||||||
|
window.addEventListener('resize', this.calcWidths);
|
||||||
|
},
|
||||||
|
updated: function () {
|
||||||
|
this.trackHorizontalSplitterOffsetLeft();
|
||||||
|
},
|
||||||
|
beforeDestroy: function () {
|
||||||
|
window.removeEventListener('resize', this.calcWidths);
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
calcWidths: function () {
|
||||||
|
var oldavailWidth = this.availWidth;
|
||||||
|
this.selfOffsetLeft = this.$refs.horizontalsplit.offsetLeft;
|
||||||
|
this.availWidth = this.$refs.horizontalsplit.offsetWidth - this.$refs.hsplitter.offsetWidth;
|
||||||
|
|
||||||
|
if ((this.leftwidth === 0 && this.rightwidth === 0) || oldavailWidth === 0) {
|
||||||
|
this.leftwidth = Math.floor(this.availWidth * (this.defaultRatio[0] / 100));
|
||||||
|
} else {
|
||||||
|
this.leftwidth = Math.floor(((this.leftwidth * 100) / oldavailWidth) / 100 * this.availWidth);
|
||||||
|
}
|
||||||
|
this.rightwidth = this.availWidth - this.leftwidth;
|
||||||
|
},
|
||||||
|
collapseLeft: function () {
|
||||||
|
this.calcWidths();
|
||||||
|
this.leftwidth = 0;
|
||||||
|
this.rightwidth = this.availWidth;
|
||||||
|
},
|
||||||
|
collapseRight: function () {
|
||||||
|
this.calcWidths();
|
||||||
|
this.leftwidth = this.availWidth;
|
||||||
|
this.rightwidth = 0;
|
||||||
|
},
|
||||||
|
showBoth: function () {
|
||||||
|
this.leftwidth = Math.floor(this.availWidth * (this.defaultRatio[0] / 100));
|
||||||
|
this.rightwidth = this.availWidth - this.leftwidth;
|
||||||
|
},
|
||||||
|
isCollapsed: function () {
|
||||||
|
if (this.leftwidth === 0) {
|
||||||
|
return 'left';
|
||||||
|
} else if (this.rightwidth === 0) {
|
||||||
|
return 'right';
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
dragStart: function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
window.addEventListener('mouseup', this.dragEnd);
|
||||||
|
window.addEventListener('mousemove', this.drag);
|
||||||
|
this.resize = true;
|
||||||
|
this.mousePosX = e.clientX;
|
||||||
|
},
|
||||||
|
drag: function (e) {
|
||||||
|
if (!this.resize) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
var offsetX = e.clientX - this.mousePosX;
|
||||||
|
this.leftwidth = this.leftwidth + offsetX;
|
||||||
|
if (this.leftwidth < 0) {
|
||||||
|
this.leftwidth = 0;
|
||||||
|
}
|
||||||
|
if (this.leftwidth > this.availWidth) {
|
||||||
|
this.leftwidth = this.availWidth;
|
||||||
|
}
|
||||||
|
this.rightwidth = this.availWidth - this.leftwidth;
|
||||||
|
this.mousePosX = e.clientX;
|
||||||
|
},
|
||||||
|
dragEnd: function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
window.removeEventListener('mousemove', this.drag);
|
||||||
|
window.removeEventListener('mouseup', this.dragEnd);
|
||||||
|
this.resize = false;
|
||||||
|
this.mousePosX = e.clientX;
|
||||||
|
},
|
||||||
|
trackHorizontalSplitterOffsetLeft: function () {
|
||||||
|
this.hsplitterOffset = this.$refs.hsplitter.offsetLeft;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
leftOrRightClass: function () {
|
||||||
|
return ((this.hsplitterOffset - this.selfOffsetLeft) <= Math.floor(this.availWidth / 2))
|
||||||
|
? 'left'
|
||||||
|
: 'right';
|
||||||
|
},
|
||||||
|
leftwidthcss: function () {
|
||||||
|
return this.leftwidth + 'px';
|
||||||
|
},
|
||||||
|
rightwidthcss: function () {
|
||||||
|
return this.rightwidth + 'px';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,5 +1,11 @@
|
|||||||
export default {
|
export default {
|
||||||
name: 'VerticalSplit',
|
name: 'VerticalSplit',
|
||||||
|
props: {
|
||||||
|
defaultRatio: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [50, 50]
|
||||||
|
}
|
||||||
|
},
|
||||||
data: function() {
|
data: function() {
|
||||||
return {
|
return {
|
||||||
availHeight: 0,
|
availHeight: 0,
|
||||||
@@ -50,17 +56,22 @@ export default {
|
|||||||
updated: function() {
|
updated: function() {
|
||||||
this.trackVerticalSplitterOffsetTop();
|
this.trackVerticalSplitterOffsetTop();
|
||||||
},
|
},
|
||||||
|
beforeDestroy: function () {
|
||||||
|
window.removeEventListener('resize', this.calcHeights);
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
calcHeights: function() {
|
calcHeights: function() {
|
||||||
var windowheight = window.innerHeight;
|
var windowheight = window.innerHeight;
|
||||||
var oldavailHeight = this.availHeight;
|
var oldavailHeight = this.availHeight;
|
||||||
this.selfOffsetTop = this.$refs.verticalsplit.offsetTop;
|
this.selfOffsetTop = this.$refs.verticalsplit.offsetTop;
|
||||||
this.availHeight = windowheight - this.selfOffsetTop - this.$refs.vsplitter.offsetHeight;
|
this.availHeight = windowheight - this.selfOffsetTop - this.$refs.vsplitter.offsetHeight;
|
||||||
|
|
||||||
if( (this.topheight === 0 && this.bottomheight === 0) || oldavailHeight === 0 ) {
|
if( (this.topheight === 0 && this.bottomheight === 0) || oldavailHeight === 0 ) {
|
||||||
this.topheight = Math.floor(this.availHeight/2);
|
this.topheight = Math.floor(this.availHeight * (this.defaultRatio[0] / 100));
|
||||||
} else {
|
} else {
|
||||||
this.topheight = Math.floor( ((((this.topheight * 100) / oldavailHeight) / 100) * this.availHeight) );
|
this.topheight = Math.floor( ((((this.topheight * 100) / oldavailHeight) / 100) * this.availHeight) );
|
||||||
}
|
}
|
||||||
|
|
||||||
this.bottomheight = this.availHeight - this.topheight;
|
this.bottomheight = this.availHeight - this.topheight;
|
||||||
},
|
},
|
||||||
collapseTop: function() {
|
collapseTop: function() {
|
||||||
@@ -74,8 +85,8 @@ export default {
|
|||||||
this.bottomheight = 0;
|
this.bottomheight = 0;
|
||||||
},
|
},
|
||||||
showBoth: function() {
|
showBoth: function() {
|
||||||
this.topheight = Math.floor(this.availHeight/2);
|
this.topheight = Math.floor(this.availHeight * (this.defaultRatio[0] / 100));
|
||||||
this.bottomheight = Math.floor(this.availHeight/2);
|
this.bottomheight = this.availHeight - this.topheight
|
||||||
},
|
},
|
||||||
isCollapsed: function() {
|
isCollapsed: function() {
|
||||||
if( this.topheight === 0 ) {
|
if( this.topheight === 0 ) {
|
||||||
|
|||||||
@@ -1,12 +1,24 @@
|
|||||||
export function tagFormatter(cell, tagComponent)
|
export function tagFormatter(cell, tagComponent)
|
||||||
{
|
{
|
||||||
|
const mappedData = tagComponent.tags.map(tag => ({
|
||||||
|
typ_kurzbz: tag.tag_typ_kurzbz,
|
||||||
|
automatisiert: tag.automatisiert
|
||||||
|
}));
|
||||||
|
|
||||||
|
|
||||||
let tags = cell.getValue();
|
let tags = cell.getValue();
|
||||||
if (!tags) return;
|
if (!tags) return;
|
||||||
|
|
||||||
let container = document.createElement('div');
|
let container = document.createElement('div');
|
||||||
container.className = "d-flex gap-1";
|
container.className = "d-flex gap-1";
|
||||||
|
|
||||||
let parsedTags = JSON.parse(tags);
|
let parsedTags = [];
|
||||||
|
if (typeof tags === 'string') {
|
||||||
|
parsedTags = JSON.parse(tags);
|
||||||
|
} else if (Array.isArray(tags)) {
|
||||||
|
parsedTags = tags;
|
||||||
|
}
|
||||||
|
|
||||||
let maxVisibleTags = 2;
|
let maxVisibleTags = 2;
|
||||||
|
|
||||||
const rowData = cell.getRow().getData();
|
const rowData = cell.getRow().getData();
|
||||||
@@ -38,10 +50,17 @@ export function tagFormatter(cell, tagComponent)
|
|||||||
tagElement.className = "tag " + tag.style;
|
tagElement.className = "tag " + tag.style;
|
||||||
if (tag.done) tagElement.className += " tag_done";
|
if (tag.done) tagElement.className += " tag_done";
|
||||||
|
|
||||||
|
const tagDef = mappedData.find(t => t.typ_kurzbz === tag.typ_kurzbz);
|
||||||
|
|
||||||
|
if (!tagDef && tag.typ_kurzbz?.includes("_auto") || tagDef?.automatisiert) {
|
||||||
|
tagElement.className += " tag_auto";
|
||||||
|
tagElement.innerHTML = "<i class='fa-solid fa-lock'></i> " + tag.beschreibung;
|
||||||
|
}
|
||||||
|
|
||||||
tagElement.addEventListener('click', (event) => {
|
tagElement.addEventListener('click', (event) => {
|
||||||
event.stopPropagation();
|
event.stopPropagation();
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
tagComponent.editTag(tag.id);
|
tagComponent.editTag(tag.id)
|
||||||
});
|
});
|
||||||
|
|
||||||
container.appendChild(tagElement);
|
container.appendChild(tagElement);
|
||||||
|
|||||||
@@ -98,6 +98,7 @@ require_once('dbupdate_3.4/75888_reihungstest_mehrfachdurchfuehrung.php');
|
|||||||
require_once('dbupdate_3.4/76150_perm_other_lv_plan.php');
|
require_once('dbupdate_3.4/76150_perm_other_lv_plan.php');
|
||||||
require_once('dbupdate_3.4/68957_dashboard_bookmark_neue_Spalte_sort.php');
|
require_once('dbupdate_3.4/68957_dashboard_bookmark_neue_Spalte_sort.php');
|
||||||
require_once('dbupdate_3.4/68530_Dashboard_Cleanup.php');
|
require_once('dbupdate_3.4/68530_Dashboard_Cleanup.php');
|
||||||
|
require_once('dbupdate_3.4/75959_StudVw_Automatische_Tags.php');
|
||||||
|
|
||||||
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
|
// *** Pruefung und hinzufuegen der neuen Attribute und Tabellen
|
||||||
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
|
echo '<H2>Pruefe Tabellen und Attribute!</H2>';
|
||||||
|
|||||||
@@ -0,0 +1,125 @@
|
|||||||
|
<?php
|
||||||
|
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
//Add column entwicklungs_id to bis.tbl_entwicklungsteam
|
||||||
|
if(!@$db->db_query("SELECT taglib FROM public.tbl_notiz_typ LIMIT 1"))
|
||||||
|
{
|
||||||
|
$qry = 'ALTER TABLE public.tbl_notiz_typ ADD COLUMN taglib character varying(32);';
|
||||||
|
|
||||||
|
if(!$db->db_query($qry))
|
||||||
|
echo '<strong> public.tbl_notiz_typ '.$db->db_last_error().'</strong><br>';
|
||||||
|
else
|
||||||
|
echo '<br>public.tbl_notiz_typ: Neue Spalte taglib hinzugefügt';
|
||||||
|
}
|
||||||
|
|
||||||
|
//automatic tags anlegen
|
||||||
|
$tags = [
|
||||||
|
[
|
||||||
|
'typ_kurzbz' => 'wh_auto',
|
||||||
|
'bezeichnung' => '{WH, R}',
|
||||||
|
'style' => 'tag_dark_grey',
|
||||||
|
'prioritaet' => 11,
|
||||||
|
'taglib' => 'tags/CoreWiederholerTagLib'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'typ_kurzbz' => 'dd_auto',
|
||||||
|
'bezeichnung' => '{DD, DD}',
|
||||||
|
'style' => 'tag_braun',
|
||||||
|
'prioritaet' => 10,
|
||||||
|
'taglib' => 'tags/CoreDoubleDegreeTagLib'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'typ_kurzbz' => 'out_auto',
|
||||||
|
'bezeichnung' => '{Out, Out}',
|
||||||
|
'style' => 'tag_limette',
|
||||||
|
'prioritaet' => 12,
|
||||||
|
'taglib' => 'tags/CoreOutgoingTagLib'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'typ_kurzbz' => 'prewh_auto',
|
||||||
|
'bezeichnung' => '{Pre-WH, pre-R}',
|
||||||
|
'style' => 'tag_light_grey',
|
||||||
|
'prioritaet' => 13,
|
||||||
|
'taglib' => 'tags/CorePrewiederholerTagLib'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'typ_kurzbz' => 'zgv_auto',
|
||||||
|
'bezeichnung' => '{ZGV offen, ZGV missing}',
|
||||||
|
'style' => 'tag_beige',
|
||||||
|
'prioritaet' => 14,
|
||||||
|
'taglib' => 'tags/CoreMissingZgvTagLib'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'typ_kurzbz' => 'unterbrecher_auto',
|
||||||
|
'bezeichnung' => '{UB, I}',
|
||||||
|
'style' => 'tag_turquoise',
|
||||||
|
'prioritaet' => 15,
|
||||||
|
'taglib' => 'tags/CoreUnterbrecherTagLib'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'typ_kurzbz' => 'stbtr_erh_auto',
|
||||||
|
'bezeichnung' => '{erh.Studienbeitrag, Incr. Tuition Fees}',
|
||||||
|
'style' => 'tag_bordeaux',
|
||||||
|
'prioritaet' => 16,
|
||||||
|
'taglib' => 'tags/CoreStbErhoehtTagLib'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
'typ_kurzbz' => 'jgv_auto',
|
||||||
|
'bezeichnung' => '{JGV, YGR}',
|
||||||
|
'style' => 'tag_olive',
|
||||||
|
'prioritaet' => 17,
|
||||||
|
'taglib' => 'tags/CoreJgvTagLib'
|
||||||
|
],
|
||||||
|
|
||||||
|
];
|
||||||
|
|
||||||
|
foreach ($tags as $tag) {
|
||||||
|
|
||||||
|
$checkQry = "
|
||||||
|
SELECT 1
|
||||||
|
FROM public.tbl_notiz_typ
|
||||||
|
WHERE typ_kurzbz = '".$tag['typ_kurzbz']."'
|
||||||
|
";
|
||||||
|
|
||||||
|
if ($result = $db->db_query($checkQry)) {
|
||||||
|
|
||||||
|
if ($db->db_num_rows($result) == 0) {
|
||||||
|
|
||||||
|
$qry = "
|
||||||
|
INSERT INTO public.tbl_notiz_typ
|
||||||
|
(
|
||||||
|
typ_kurzbz,
|
||||||
|
bezeichnung_mehrsprachig,
|
||||||
|
automatisiert,
|
||||||
|
aktiv,
|
||||||
|
tag,
|
||||||
|
style,
|
||||||
|
vorrueckung,
|
||||||
|
prioritaet,
|
||||||
|
taglib
|
||||||
|
)
|
||||||
|
VALUES
|
||||||
|
(
|
||||||
|
'".$tag['typ_kurzbz']."',
|
||||||
|
'".$tag['bezeichnung']."',
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
'".$tag['style']."',
|
||||||
|
false,
|
||||||
|
'".$tag['prioritaet']."',
|
||||||
|
'".$tag['taglib']."'
|
||||||
|
)
|
||||||
|
";
|
||||||
|
|
||||||
|
if (!$db->db_query($qry))
|
||||||
|
{
|
||||||
|
echo '<strong>public.tbl_notiz_typ: '. $tag['typ_kurzbz']. ' '. $db->db_last_error().'</strong><br>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
echo '<br>public.tbl_notiz_typ: Automatic Tag '.$tag['typ_kurzbz'].' hinzugefuegt';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+649
-71
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user