mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-12 15:04:04 +00:00
Compare commits
70
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47716f1aff | ||
|
|
682ad7c0e8 | ||
|
|
8b68e60ae8 | ||
|
|
bdf8b3c609 | ||
|
|
f616d70a5d | ||
|
|
e70449046e | ||
|
|
53e64cc83f | ||
|
|
4f8ffa1228 | ||
|
|
6d641bbd06 | ||
|
|
3455aed3f5 | ||
|
|
f84d12277d | ||
|
|
9bf5bc2ad9 | ||
|
|
27765606e3 | ||
|
|
a826bd7bc7 | ||
|
|
75d2cabdbe | ||
|
|
bae9d6d9a0 | ||
|
|
43d6a882ce | ||
|
|
7f3b4100ab | ||
|
|
9f54ecce54 | ||
|
|
7af0f4a478 | ||
|
|
0f843db33d | ||
|
|
3e59648d5b | ||
|
|
5923991848 | ||
|
|
55a6ec9d0d | ||
|
|
78505589c8 | ||
|
|
0e985113ec | ||
|
|
8d9113d5c8 | ||
|
|
7ce81ad4bd | ||
|
|
ea56ec8daa | ||
|
|
bf5ee2f64b | ||
|
|
55d6d90fa6 | ||
|
|
6adc55a843 | ||
|
|
52c1fba17b | ||
|
|
5e15d4b219 | ||
|
|
00954f680b | ||
|
|
92d27fc242 | ||
|
|
f6bb27cdb0 | ||
|
|
558963cd74 | ||
|
|
0b5c0f27a5 | ||
|
|
f846bb221a | ||
|
|
d8355ba3f5 | ||
|
|
afb8011347 | ||
|
|
6d5a4531e1 | ||
|
|
d85a3cb08f | ||
|
|
15beaa9be8 | ||
|
|
574057da88 | ||
|
|
c81b5338de | ||
|
|
c433ff5c3a | ||
|
|
a5797a0bde | ||
|
|
772b8c603c | ||
|
|
37d5f2da5d | ||
|
|
27c39cfdca | ||
|
|
d66fe72cc9 | ||
|
|
59ac56374e | ||
|
|
a397460e0e | ||
|
|
108f91ea1a | ||
|
|
dc5a846c10 | ||
|
|
06895510e0 | ||
|
|
83b06b6c50 | ||
|
|
bd99f3f927 | ||
|
|
eeb1529b64 | ||
|
|
98c3707802 | ||
|
|
e5c8807f17 | ||
|
|
2f86a1b017 | ||
|
|
75ddbdf7c1 | ||
|
|
d824334538 | ||
|
|
13515b2522 | ||
|
|
c5c29df6cc | ||
|
|
6324c3d467 | ||
|
|
377c53cf60 |
@@ -114,6 +114,7 @@ class LvPlan extends FHCAPI_Controller
|
|||||||
|
|
||||||
// fetching lvplan events
|
// fetching lvplan events
|
||||||
$result = $this->stundenplanlib->getEventsUser($start_date, $end_date, $uid);
|
$result = $this->stundenplanlib->getEventsUser($start_date, $end_date, $uid);
|
||||||
|
|
||||||
$lvplanEvents = $this->getDataOrTerminateWithError($result);
|
$lvplanEvents = $this->getDataOrTerminateWithError($result);
|
||||||
|
|
||||||
// fetching moodle events
|
// fetching moodle events
|
||||||
|
|||||||
@@ -62,6 +62,8 @@ class OtherLvPlan extends FHCAPI_Controller
|
|||||||
"foto" => $profileData->data->foto,
|
"foto" => $profileData->data->foto,
|
||||||
"vorname" => $profileData->data->vorname,
|
"vorname" => $profileData->data->vorname,
|
||||||
"nachname" => $profileData->data->nachname,
|
"nachname" => $profileData->data->nachname,
|
||||||
|
"titel" => $profileData->data->titel,
|
||||||
|
"postnomen" => $profileData->data->postnomen,
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
parent::__construct([
|
parent::__construct([
|
||||||
'getStundenplan' => ['admin:r', 'assistenz:r'],
|
'getStundenplan' => ['admin:r', 'assistenz:r'],
|
||||||
'getStudiensemester' => ['admin:r', 'assistenz:r'],
|
'getStudiensemester' => ['admin:r', 'assistenz:r'],
|
||||||
|
'getStundenplanForStudiensemester' => ['admin:r', 'assistenz:r'],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
// Load Libraries
|
// Load Libraries
|
||||||
@@ -32,37 +33,147 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
$this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel');
|
$this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel');
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO Build own lib or combine with Controller Stundenplan.php
|
|
||||||
//here use of logic of Stundenplan.php, extended with parameters uid, grouping, and used dbTable
|
|
||||||
public function getStundenplan($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
|
public function getStundenplan($uid, $start_date = null, $end_date = null, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
|
||||||
{
|
{
|
||||||
|
$this->getStundenplanbh($uid, '2026-02-04', '2027-02-03', $dbStundenplanTable, $groupConsecutiveHours);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getStundenplanForStudiensemester($uid, $studiensemester_kurzbz, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
|
||||||
|
{
|
||||||
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
$resstudiensemester = getData($this->StudiensemesterModel->getStartEndeFromStudiensemester($studiensemester_kurzbz));
|
||||||
|
$resnextstudiensemester = getData($this->StudiensemesterModel->getNextFrom($studiensemester_kurzbz));
|
||||||
|
|
||||||
|
$studiensemester = ($resstudiensemester && count($resstudiensemester) > 0) ? $resstudiensemester[0] : null;
|
||||||
|
$studiensemester->studiensemester_kurzbz = $studiensemester_kurzbz;
|
||||||
|
$nextstudiensemester = ($resnextstudiensemester && count($resnextstudiensemester) > 0) ? $resnextstudiensemester[0] : null;
|
||||||
|
|
||||||
|
$this->addMeta('bhsemester', $studiensemester);
|
||||||
|
$this->addMeta('bhnextsemester', $nextstudiensemester);
|
||||||
|
|
||||||
|
$this->getStundenplanbh($uid, $studiensemester, $nextstudiensemester, $dbStundenplanTable, $groupConsecutiveHours);
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO Build own lib or combine with Controller Stundenplan.php
|
||||||
|
//here use of logic of Stundenplan.php, extended with parameters uid, grouping, and used dbTable
|
||||||
|
public function getStundenplanbh($uid, $studiensemester, $nextstudiensemester, $dbStundenplanTable = "stundenplan", $groupConsecutiveHours = false)
|
||||||
|
{
|
||||||
|
$start_date = $studiensemester->start;
|
||||||
|
$end_date = $nextstudiensemester->ende;
|
||||||
|
$this->load->library('StundenplanLib');
|
||||||
|
|
||||||
|
$ci = get_instance();
|
||||||
$student_uid = $uid;
|
$student_uid = $uid;
|
||||||
$semester_range = $this->studienSemesterErmitteln($start_date, $end_date);
|
$semester_range = $this->stundenplanlib->studienSemesterErmitteln($start_date, $end_date);
|
||||||
|
if (isError($semester_range))
|
||||||
|
return $semester_range;
|
||||||
|
$semester_range = getData($semester_range);
|
||||||
|
$ci->addMeta('semester_range', $semester_range);
|
||||||
|
|
||||||
|
$first_semester = $semester_range[0];
|
||||||
|
|
||||||
$this->sortStudienSemester($semester_range);
|
$this->sortStudienSemester($semester_range);
|
||||||
$this->applyLoadUeberSemesterHaelfte($semester_range);
|
$function_error = $this->stundenplanlib->applyLoadUeberSemesterHaelfte($semester_range);
|
||||||
|
$ci->addMeta('nach_apply_semester_range', $semester_range);
|
||||||
|
if ($function_error)
|
||||||
|
return $function_error;
|
||||||
|
|
||||||
$benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($semester_range, $student_uid);
|
$benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range, $nextstudiensemester->studiensemester_kurzbz);
|
||||||
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range, $student_uid);
|
if (isError($benutzer_gruppen))
|
||||||
|
return $benutzer_gruppen;
|
||||||
|
$benutzer_gruppen = getData($benutzer_gruppen);
|
||||||
|
$ci->addMeta('spezialgruppen', $benutzer_gruppen);
|
||||||
|
// getting the student_lehrverbaende of the student in the different studiensemester
|
||||||
|
|
||||||
if(!$groupConsecutiveHours)
|
$ci->addMeta('bhsemtest', print_r($semester_range, true));
|
||||||
$stundenplan_query = $this->StundenplanModel->getStundenplanQuery(
|
/*
|
||||||
$start_date,
|
$semester_range = array(
|
||||||
$end_date,
|
'SS2026' => array(
|
||||||
$semester_range,
|
'WS2025' => (object) array(
|
||||||
$benutzer_gruppen,
|
'start' => '2026-02-04',
|
||||||
$student_lehrverband
|
'ende' => '2026-05-19'
|
||||||
);
|
),
|
||||||
else
|
'SS2026' => (object) array(
|
||||||
$stundenplan_query = $this->StundenplanModel->getStundenplanQuery(
|
'start' => '2026-02-04',
|
||||||
$start_date,
|
'ende' => '2026-11-15'
|
||||||
$end_date,
|
),
|
||||||
$semester_range,
|
'WS2026' => (object) array(
|
||||||
$benutzer_gruppen,
|
'start' => '2026-09-01',
|
||||||
$student_lehrverband,
|
'ende' => '2027-02-03'
|
||||||
true,
|
)
|
||||||
$dbStundenplanTable
|
)
|
||||||
);
|
);
|
||||||
|
*/
|
||||||
|
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range, $studiensemester->studiensemester_kurzbz, $nextstudiensemester->studiensemester_kurzbz);
|
||||||
|
|
||||||
|
//get semester
|
||||||
|
if (isError($student_lehrverband))
|
||||||
|
return $student_lehrverband;
|
||||||
|
$student_lehrverband = getData($student_lehrverband);
|
||||||
|
/*
|
||||||
|
$student_lehrverband = array (
|
||||||
|
'SS2026' =>
|
||||||
|
array (
|
||||||
|
0 =>
|
||||||
|
(object) array(
|
||||||
|
'verbandsgruppe' => 'BEE1A',
|
||||||
|
'studiengang_kz' => 476,
|
||||||
|
'semester' => 1,
|
||||||
|
'verband' => 'A',
|
||||||
|
'gruppe' => ' ',
|
||||||
|
'studiensemester_kurzbz' => 'WS2025',
|
||||||
|
),
|
||||||
|
1 =>
|
||||||
|
(object) array(
|
||||||
|
'verbandsgruppe' => 'BEE2A',
|
||||||
|
'studiengang_kz' => 476,
|
||||||
|
'semester' => 2,
|
||||||
|
'verband' => 'A',
|
||||||
|
'gruppe' => ' ',
|
||||||
|
'studiensemester_kurzbz' => 'SS2026',
|
||||||
|
),
|
||||||
|
2 =>
|
||||||
|
(object) array(
|
||||||
|
'verbandsgruppe' => 'BEE3A',
|
||||||
|
'studiengang_kz' => 476,
|
||||||
|
'semester' => 3,
|
||||||
|
'verband' => 'A',
|
||||||
|
'gruppe' => ' ',
|
||||||
|
'studiensemester_kurzbz' => 'SS2026',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
$ci->addMeta('studentlehrverbaende', $student_lehrverband);
|
||||||
|
|
||||||
|
$this->load->model('crm/Student_model', 'StudentModel');
|
||||||
|
$this->StudentModel->addSelect('ausbildungssemester');
|
||||||
|
$this->StudentModel->addJoin('public.tbl_prestudentstatus ps', 'prestudent_id');
|
||||||
|
$result = $this->StudentModel->loadWhere(array(
|
||||||
|
"student_uid"=>$student_uid,
|
||||||
|
'studiensemester_kurzbz' => $first_semester,
|
||||||
|
));
|
||||||
|
if (isError($result))
|
||||||
|
$semesterStud = null;
|
||||||
|
if(hasData($result)){
|
||||||
|
$result = getData($result);
|
||||||
|
$data = current($result);
|
||||||
|
$semesterStud = $data->ausbildungssemester;
|
||||||
|
}
|
||||||
|
|
||||||
|
$stundenplan_query = $this->StundenplanModel->getStundenplanQuery(
|
||||||
|
$start_date,
|
||||||
|
$end_date, //will be overwritten in model if $ende_semProlonged
|
||||||
|
$semester_range,
|
||||||
|
$benutzer_gruppen,
|
||||||
|
$student_lehrverband,
|
||||||
|
$dbStundenplanTable,
|
||||||
|
$groupConsecutiveHours,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
|
||||||
|
$ci->addMeta('bhstdplanquery', $stundenplan_query);
|
||||||
|
|
||||||
if(!$stundenplan_query)
|
if(!$stundenplan_query)
|
||||||
{
|
{
|
||||||
@@ -84,47 +195,23 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
|
|
||||||
public function getStudiensemester()
|
public function getStudiensemester()
|
||||||
{
|
{
|
||||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
|
||||||
$this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC');
|
$this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC');
|
||||||
$result = $this->StudiensemesterModel->load();
|
$result = $this->StudiensemesterModel->load();
|
||||||
$data = $this->getDataOrTerminateWithError($result);
|
$data = $this->getDataOrTerminateWithError($result);
|
||||||
$this->terminateWithSuccess($data);
|
$this->terminateWithSuccess($data);
|
||||||
}
|
}
|
||||||
|
|
||||||
//copied from Stundenplan.php
|
// TODO(Manu) following 5 private functions are copybased of StundenplanLib,
|
||||||
private function studienSemesterErmitteln($start_date, $end_date)
|
// just applyLoadUeberSemesterHaelfte is different
|
||||||
{
|
// after approval: change to public in StundenplanLib and use it here?
|
||||||
// gets all studiensemester from the student from start_date to end_date
|
|
||||||
$semester_range = $this->StudiensemesterModel->getByDateRange($start_date, $end_date);
|
|
||||||
$semester_range = array_map(
|
|
||||||
function ($sem) {
|
|
||||||
return $sem->studiensemester_kurzbz;
|
|
||||||
},
|
|
||||||
$this->getDataOrTerminateWithError($semester_range)
|
|
||||||
);
|
|
||||||
|
|
||||||
// if no studiensemester is found for the given timespan, get the nearest studiensemester
|
private function sortStudienSemester(&$semester_range){
|
||||||
if(count($semester_range) == 0)
|
|
||||||
{
|
|
||||||
$aktuelle_studiensemester = $this->StudiensemesterModel->getNearest();
|
|
||||||
$aktuelle_studiensemester = $this->getDataOrTerminateWithError($aktuelle_studiensemester);
|
|
||||||
if (count($aktuelle_studiensemester) == 0) {
|
|
||||||
$this->terminateWithError("No aktuelles semester");
|
|
||||||
}
|
|
||||||
$aktuelle_studiensemester = current($aktuelle_studiensemester)->studiensemester_kurzbz;
|
|
||||||
// push aktuelles semester in active semester array
|
|
||||||
array_push($semester_range, $aktuelle_studiensemester);
|
|
||||||
}
|
|
||||||
return $semester_range;
|
|
||||||
}
|
|
||||||
|
|
||||||
//copied from Stundenplan.php
|
|
||||||
private function sortStudienSemester(&$semester_range)
|
|
||||||
{
|
|
||||||
usort(
|
usort(
|
||||||
$semester_range,
|
$semester_range,
|
||||||
function ($first, $second) {
|
function($first, $second)
|
||||||
|
{
|
||||||
$sem_first = null;
|
$sem_first = null;
|
||||||
$year_first = null;
|
$year_first = null;
|
||||||
$match_first = null;
|
$match_first = null;
|
||||||
@@ -133,8 +220,8 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
$year_second = null;
|
$year_second = null;
|
||||||
$match_second = null;
|
$match_second = null;
|
||||||
|
|
||||||
preg_match('/([WS]+)([0-9]+)/', $first, $match_first);
|
preg_match('/([WS]+)([0-9]+)/',$first,$match_first);
|
||||||
preg_match('/([WS]+)([0-9]+)/', $second, $match_second);
|
preg_match('/([WS]+)([0-9]+)/',$second,$match_second);
|
||||||
|
|
||||||
$sem_first = $match_first[1];
|
$sem_first = $match_first[1];
|
||||||
$year_first = intval($match_first[2]);
|
$year_first = intval($match_first[2]);
|
||||||
@@ -146,15 +233,15 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
elseif($year_first > $year_second)
|
else if($year_first > $year_second)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
elseif($year_first == $year_second && $sem_first > $sem_second)
|
else if($year_first == $year_second && $sem_first > $sem_second)
|
||||||
{
|
{
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
elseif($year_first == $year_second && $sem_first < $sem_second)
|
else if($year_first == $year_second && $sem_first < $sem_second)
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -163,9 +250,151 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
//copied from Stundenplan.php
|
private function fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range, $skip_semester_kurzbz)
|
||||||
|
{
|
||||||
|
$this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel');
|
||||||
|
|
||||||
|
$benutzer_gruppen = [];
|
||||||
|
// for each studiensemester fetch the benutzer gruppen and add them to an associate $bentuzer_gruppen array
|
||||||
|
/*
|
||||||
|
[
|
||||||
|
['WS2023'] => [['gruppe1_SS2023','gruppe2_SS2023'],['gruppe1_WS2023','gruppe2_WS2023']],
|
||||||
|
['SS2024'] => [['gruppe1_WS2023','gruppe2_WS2023'],['gruppe1_SS2024','gruppe2_SS2024']],
|
||||||
|
['WS2024'] => [['gruppe1_SS2024','gruppe2_SS2024'],['gruppe1_WS2024','gruppe2_WS2024']],
|
||||||
|
]
|
||||||
|
*/
|
||||||
|
foreach($semester_range as $semester_key => $semester_array)
|
||||||
|
{
|
||||||
|
$benutzer_gruppen[$semester_key] = [];
|
||||||
|
// each semester could have ajoint semesters that need to be checked
|
||||||
|
foreach($semester_array as $semester=>$semester_date_range)
|
||||||
|
{
|
||||||
|
if($semester === $skip_semester_kurzbz)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// for each active semester query the benutzer_gruppen associated to the semester
|
||||||
|
$benutzer_query = $this->BenutzergruppeModel->execReadOnlyQuery("
|
||||||
|
SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz = ?",[$student_uid, $semester]);
|
||||||
|
if(isError($benutzer_query)){
|
||||||
|
return error(getData($benutzer_query));
|
||||||
|
}
|
||||||
|
$benutzer_query_result = getData($benutzer_query)??[];
|
||||||
|
|
||||||
|
array_push(
|
||||||
|
$benutzer_gruppen[$semester_key],
|
||||||
|
array_map(
|
||||||
|
function($item)
|
||||||
|
{
|
||||||
|
return "'".$item->gruppe_kurzbz. "'";
|
||||||
|
},
|
||||||
|
$benutzer_query_result
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// merge the gruppen of each studiensemester together for the original studiensemester
|
||||||
|
/*
|
||||||
|
[
|
||||||
|
['WS2023'] => ['gruppe1_SS2023','gruppe2_SS2023','gruppe1_WS2023','gruppe2_WS2023'],
|
||||||
|
['SS2024'] => ['gruppe1_WS2023','gruppe2_WS2023','gruppe1_SS2024','gruppe2_SS2024'],
|
||||||
|
['WS2024'] => ['gruppe1_SS2024','gruppe2_SS2024','gruppe1_WS2024','gruppe2_WS2024'],
|
||||||
|
]
|
||||||
|
*/
|
||||||
|
$benutzer_gruppen = array_map(
|
||||||
|
function($gruppe)
|
||||||
|
{
|
||||||
|
$merged_gruppe = [];
|
||||||
|
foreach($gruppe as $gruppen_array)
|
||||||
|
{
|
||||||
|
$merged_gruppe = array_merge($merged_gruppe, $gruppen_array);
|
||||||
|
}
|
||||||
|
return $merged_gruppe;
|
||||||
|
},
|
||||||
|
$benutzer_gruppen
|
||||||
|
);
|
||||||
|
|
||||||
|
return success($benutzer_gruppen);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range, $studiensemester_kurzbz, $nextstudiensemester_kurzbz)
|
||||||
|
{
|
||||||
|
$this->load->model('person/Benutzergruppe_model', 'BenutzergruppeModel');
|
||||||
|
|
||||||
|
$student_lehrverband = [];
|
||||||
|
// for each studiensemester fetch the studentlehrverbaende and add them to an associate $student_lehrverband array
|
||||||
|
/*
|
||||||
|
[
|
||||||
|
['WS2023'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ] ],
|
||||||
|
['SS2024'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ] ],
|
||||||
|
['WS2024'] => [ [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ] ],
|
||||||
|
]
|
||||||
|
*/
|
||||||
|
foreach($semester_range as $semester_key => $semester_array)
|
||||||
|
{
|
||||||
|
$student_lehrverband[$semester_key] = [];
|
||||||
|
foreach($semester_array as $semester=>$semester_date_range)
|
||||||
|
{
|
||||||
|
// for each active semester query the student_lehrverband associated to the semester
|
||||||
|
$lehrverband_query = $this->BenutzergruppeModel->execReadOnlyQuery("
|
||||||
|
SELECT vbd.*, UPPER(s.typ || s.kurzbz) as stg FROM tbl_studentlehrverband vbd join tbl_studiengang s USING(studiengang_kz) where vbd.student_uid = ? AND vbd.studiensemester_kurzbz = ?", [$student_uid, $semester]);
|
||||||
|
if(isError($lehrverband_query)){
|
||||||
|
return error(getData($lehrverband_query));
|
||||||
|
}
|
||||||
|
$lehrverband_query_result = getData($lehrverband_query)??[];
|
||||||
|
|
||||||
|
$converted_studentLehrverband= array_map(
|
||||||
|
function ($item) use($nextstudiensemester_kurzbz, $studiensemester_kurzbz)
|
||||||
|
{
|
||||||
|
$result = new stdClass();
|
||||||
|
$result->verbandsgruppe = $item->stg . $item->semester . trim($item->verband) . trim($item->gruppe);
|
||||||
|
$result->studiengang_kz = $item->studiengang_kz;
|
||||||
|
$result->semester = $item->semester;
|
||||||
|
$result->verband = $item->verband;
|
||||||
|
$result->gruppe = $item->gruppe;
|
||||||
|
$result->studiensemester_kurzbz = $item->studiensemester_kurzbz;
|
||||||
|
$result->query_studiensemester_kurzbz = ($item->studiensemester_kurzbz === $nextstudiensemester_kurzbz) ? $studiensemester_kurzbz : $item->studiensemester_kurzbz;
|
||||||
|
return $result;
|
||||||
|
},
|
||||||
|
$lehrverband_query_result);
|
||||||
|
|
||||||
|
array_push($student_lehrverband[$semester_key], $converted_studentLehrverband);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// merge the studentlehrverband of each studiensemester together for the original studiensemester
|
||||||
|
/*
|
||||||
|
[
|
||||||
|
['WS2023'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ],
|
||||||
|
['SS2024'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ],
|
||||||
|
['WS2024'] => [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ],
|
||||||
|
]
|
||||||
|
*/
|
||||||
|
|
||||||
|
$student_lehrverband = array_map(
|
||||||
|
function($studentlehrverband)
|
||||||
|
{
|
||||||
|
$merged_studentlehrverband = [];
|
||||||
|
foreach($studentlehrverband as $studentlehrverband_array)
|
||||||
|
{
|
||||||
|
$merged_studentlehrverband = array_merge($merged_studentlehrverband, $studentlehrverband_array);
|
||||||
|
}
|
||||||
|
return $merged_studentlehrverband;
|
||||||
|
},
|
||||||
|
$student_lehrverband
|
||||||
|
);
|
||||||
|
|
||||||
|
return success($student_lehrverband);
|
||||||
|
}
|
||||||
|
|
||||||
|
//note: this is different to the version in StundenplanLib, changes apply just to LVTermine in StudVW
|
||||||
private function applyLoadUeberSemesterHaelfte(&$semester_range)
|
private function applyLoadUeberSemesterHaelfte(&$semester_range)
|
||||||
{
|
{
|
||||||
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@var($semester_collection)
|
@var($semester_collection)
|
||||||
convert the array of studiensemester into an associative array with the studiensemester as the key
|
convert the array of studiensemester into an associative array with the studiensemester as the key
|
||||||
@@ -185,9 +414,13 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
foreach($semester_range as $studiensemester)
|
foreach($semester_range as $studiensemester)
|
||||||
{
|
{
|
||||||
$previous_studiensemester = $this->StudiensemesterModel->getPreviousFrom($studiensemester);
|
$previous_studiensemester = $this->StudiensemesterModel->getPreviousFrom($studiensemester);
|
||||||
$previous_studiensemester = $this->getDataOrTerminateWithError($previous_studiensemester);
|
if(isError($previous_studiensemester))
|
||||||
|
{
|
||||||
|
return error(getData($previous_studiensemester));
|
||||||
|
}
|
||||||
|
$previous_studiensemester = getData($previous_studiensemester);
|
||||||
if (count($previous_studiensemester) == 0) {
|
if (count($previous_studiensemester) == 0) {
|
||||||
$this->terminateWithError("No previous semester");
|
return error('no previous semester');
|
||||||
}
|
}
|
||||||
$previous_studiensemester = current($previous_studiensemester)->studiensemester_kurzbz;
|
$previous_studiensemester = current($previous_studiensemester)->studiensemester_kurzbz;
|
||||||
$semester_collection[$studiensemester] = [$previous_studiensemester, $studiensemester];
|
$semester_collection[$studiensemester] = [$previous_studiensemester, $studiensemester];
|
||||||
@@ -237,25 +470,33 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
foreach($semester_collection as $semester_original => $semester_adjoint)
|
foreach($semester_collection as $semester_original => $semester_adjoint)
|
||||||
{
|
{
|
||||||
$semester_start_ende = $this->StudiensemesterModel->getStartEndeFromStudiensemester($semester_original);
|
$semester_start_ende = $this->StudiensemesterModel->getStartEndeFromStudiensemester($semester_original);
|
||||||
$semester_start_ende = current($this->getDataOrTerminateWithError($semester_start_ende));
|
if(isError($semester_start_ende))
|
||||||
|
{
|
||||||
|
return error(getData($semester_start_ende));
|
||||||
|
}
|
||||||
|
$semester_start_ende = current(getData($semester_start_ende));
|
||||||
|
|
||||||
// initialize empty arrays to add key value pairs
|
// initialize empty arrays to add key value pairs
|
||||||
$studienSemesterDateRanges[$semester_original] = [];
|
$studienSemesterDateRanges[$semester_original] = [];
|
||||||
|
|
||||||
// check if the studiensemester is a summer semester and add 1 month to bridge the school summer break
|
// check if the studiensemester is a summer semester and add 1 month to bridge the school summer break
|
||||||
$match = null;
|
$match = null;
|
||||||
preg_match("/^(SS)([0-9]+)/", $semester_original, $match);
|
preg_match("/^(SS)([0-9]+)/",$semester_original,$match);
|
||||||
if(count($match) >0)
|
if(count($match) >0)
|
||||||
{
|
{
|
||||||
$one_month = new DateInterval('P1M');
|
$one_month = new DateInterval('P1M');
|
||||||
$one_day = DateInterval::createFromDateString('1 days');
|
$one_day = DateInterval::createFromDateString('1 days');
|
||||||
$summer_studiensemester_end_date = DateTime::createFromFormat('Y-m-d', $semester_start_ende->ende);
|
$summer_studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende);
|
||||||
$summer_studiensemester_end_date->add($one_month);
|
$summer_studiensemester_end_date->add($one_month);
|
||||||
$summer_studiensemester_end_date->sub($one_day);
|
$summer_studiensemester_end_date->sub($one_day);
|
||||||
$semester_start_ende->ende = date_format($summer_studiensemester_end_date, 'Y-m-d');
|
$semester_start_ende->ende = date_format($summer_studiensemester_end_date,'Y-m-d');
|
||||||
}
|
}
|
||||||
if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE === true)
|
|
||||||
|
//TODO(Manu) config not taken into account
|
||||||
|
if (defined('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE') && LVPLAN_LOAD_UEBER_SEMESTERHAELFTE)
|
||||||
{
|
{
|
||||||
|
$this->addMeta('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE_TRUE', $semester_range);
|
||||||
|
|
||||||
foreach($semester_adjoint as $adjoint)
|
foreach($semester_adjoint as $adjoint)
|
||||||
{
|
{
|
||||||
$studienSemesterDateRanges[$semester_original][$adjoint]=$semester_start_ende;
|
$studienSemesterDateRanges[$semester_original][$adjoint]=$semester_start_ende;
|
||||||
@@ -263,139 +504,106 @@ class LvTermine extends FHCAPI_Controller
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
$this->addMeta('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE_FALSE', $semester_range);
|
||||||
//TODO: half of a DateInterval might not be correctly calculated
|
//TODO: half of a DateInterval might not be correctly calculated
|
||||||
// calculate the half of the studiensemester
|
// calculate the half of the studiensemester
|
||||||
$studiensemester_start_date = DateTime::createFromFormat('Y-m-d', $semester_start_ende->start);
|
$studiensemester_start_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->start);
|
||||||
$studiensemester_end_date = DateTime::createFromFormat('Y-m-d', $semester_start_ende->ende);
|
$studiensemester_end_date = DateTime::createFromFormat('Y-m-d',$semester_start_ende->ende);
|
||||||
$studiensemester_time_difference = $studiensemester_start_date->diff($studiensemester_end_date);
|
$studiensemester_time_difference = $studiensemester_start_date->diff($studiensemester_end_date);
|
||||||
$half_dateNumber = ceil($studiensemester_time_difference->d/2)+ceil(($studiensemester_time_difference->m*30)/2);
|
$half_dateNumber = ceil($studiensemester_time_difference->d/2)+ceil(($studiensemester_time_difference->m*30)/2);
|
||||||
$half_dateInterval = new DateInterval('P'.strval($half_dateNumber) .'D');
|
$half_dateInterval = new DateInterval('P'.strval($half_dateNumber) .'D');
|
||||||
$studiensemester_half = date_format($studiensemester_start_date->add($half_dateInterval), 'Y-m-d');
|
$studiensemester_half = date_format($studiensemester_start_date->add($half_dateInterval),'Y-m-d');
|
||||||
|
|
||||||
$first_half = new stdClass();
|
$first_half = new stdClass();
|
||||||
$first_half->start = $semester_start_ende->start;
|
$first_half->start = $semester_start_ende->start;
|
||||||
$first_half->ende = $studiensemester_half;
|
$first_half->ende = $studiensemester_half;
|
||||||
|
|
||||||
$studienSemesterDateRanges[$semester_original][$semester_adjoint[0]] = $first_half;
|
$studienSemesterDateRanges[$semester_original][$semester_adjoint[0]] = $first_half;
|
||||||
$studienSemesterDateRanges[$semester_original][$semester_adjoint[1]] = $semester_start_ende;
|
$studiensemester_start_date = DateTime::createFromFormat(
|
||||||
|
'Y-m-d',
|
||||||
|
$semester_start_ende->start
|
||||||
|
);
|
||||||
|
|
||||||
|
$studiensemester_end_date = DateTime::createFromFormat(
|
||||||
|
'Y-m-d',
|
||||||
|
$semester_start_ende->ende
|
||||||
|
);
|
||||||
|
|
||||||
|
$studiensemester_time_difference = $studiensemester_start_date->diff(
|
||||||
|
$studiensemester_end_date
|
||||||
|
);
|
||||||
|
|
||||||
|
$half_dateNumber =
|
||||||
|
ceil($studiensemester_time_difference->d / 2) +
|
||||||
|
ceil(($studiensemester_time_difference->m * 30) / 2);
|
||||||
|
|
||||||
|
$half_dateInterval = new DateInterval(
|
||||||
|
'P' . strval($half_dateNumber) . 'D'
|
||||||
|
);
|
||||||
|
|
||||||
|
$second_semester_end_date = clone $studiensemester_end_date;
|
||||||
|
$second_semester_end_date->add($half_dateInterval);
|
||||||
|
|
||||||
|
$second_semester_date_range = clone $semester_start_ende;
|
||||||
|
$second_semester_date_range->ende = $second_semester_end_date->format('Y-m-d');
|
||||||
|
|
||||||
|
// 2nd Adjacent-Semester: old time intervall plus half next semester
|
||||||
|
$studienSemesterDateRanges[$semester_original][$semester_adjoint[1]] = $second_semester_date_range;
|
||||||
}
|
}
|
||||||
$semester_range = $studienSemesterDateRanges;
|
$semester_range = $studienSemesterDateRanges;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//copied from Stundenplan.php, extended with $student_uid
|
private function studienSemesterErmitteln($start_date, $end_date)
|
||||||
private function fetchBenutzerGruppenFromStudiensemester($semester_range, $student_uid)
|
|
||||||
{
|
{
|
||||||
//$student_uid = getAuthUID();
|
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
$benutzer_gruppen = [];
|
|
||||||
// for each studiensemester fetch the benutzer gruppen and add them to an associate $bentuzer_gruppen array
|
|
||||||
/*
|
|
||||||
[
|
|
||||||
['WS2023'] => [['gruppe1_SS2023','gruppe2_SS2023'],['gruppe1_WS2023','gruppe2_WS2023']],
|
|
||||||
['SS2024'] => [['gruppe1_WS2023','gruppe2_WS2023'],['gruppe1_SS2024','gruppe2_SS2024']],
|
|
||||||
['WS2024'] => [['gruppe1_SS2024','gruppe2_SS2024'],['gruppe1_WS2024','gruppe2_WS2024']],
|
|
||||||
]
|
|
||||||
*/
|
|
||||||
foreach($semester_range as $semester_key => $semester_array)
|
|
||||||
{
|
|
||||||
$benutzer_gruppen[$semester_key] = [];
|
|
||||||
// each semester could have ajoint semesters that need to be checked
|
|
||||||
foreach($semester_array as $semester => $semester_date_range)
|
|
||||||
{
|
|
||||||
// for each active semester query the benutzer_gruppen associated to the semester
|
|
||||||
$benutzer_query = $this->BenutzergruppeModel->execReadOnlyQuery("
|
|
||||||
SELECT * FROM tbl_benutzergruppe where uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]);
|
|
||||||
$benutzer_query_result = $this->getDataOrTerminateWithError($benutzer_query);
|
|
||||||
array_push(
|
|
||||||
$benutzer_gruppen[$semester_key],
|
|
||||||
array_map(
|
|
||||||
function ($item) {
|
|
||||||
return "'".$item->gruppe_kurzbz. "'";
|
|
||||||
},
|
|
||||||
$benutzer_query_result
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// merge the gruppen of each studiensemester together for the original studiensemester
|
// gets all studiensemester from the student from start_date to end_date
|
||||||
/*
|
//$semester_range = $this->StudiensemesterModel->getByDateRange($start_date, $end_date);
|
||||||
[
|
$semester_range = $this->StudiensemesterModel->getContainingOrNearestByDateRange($start_date, $end_date);
|
||||||
['WS2023'] => ['gruppe1_SS2023','gruppe2_SS2023','gruppe1_WS2023','gruppe2_WS2023'],
|
if (isError($semester_range))
|
||||||
['SS2024'] => ['gruppe1_WS2023','gruppe2_WS2023','gruppe1_SS2024','gruppe2_SS2024'],
|
return $semester_range;
|
||||||
['WS2024'] => ['gruppe1_SS2024','gruppe2_SS2024','gruppe1_WS2024','gruppe2_WS2024'],
|
|
||||||
]
|
$semester_range = array_map(
|
||||||
*/
|
function ($sem) {
|
||||||
$benutzer_gruppen = array_map(
|
return $sem->studiensemester_kurzbz;
|
||||||
function ($gruppe) {
|
|
||||||
$merged_gruppe = [];
|
|
||||||
foreach($gruppe as $gruppen_array)
|
|
||||||
{
|
|
||||||
$merged_gruppe = array_merge($merged_gruppe, $gruppen_array);
|
|
||||||
}
|
|
||||||
return $merged_gruppe;
|
|
||||||
},
|
},
|
||||||
$benutzer_gruppen
|
getData($semester_range) ?: []
|
||||||
);
|
);
|
||||||
|
|
||||||
return $benutzer_gruppen;
|
// if no studiensemester is found for the given timespan, get the nearest studiensemester
|
||||||
}
|
if (count($semester_range) == 0)
|
||||||
|
|
||||||
//copied from Stundenplan.php, extended with $student_uid
|
|
||||||
private function fetchStudentlehrverbandFromStudiensemester($semester_range, $student_uid)
|
|
||||||
{
|
|
||||||
//$student_uid = getAuthUID();
|
|
||||||
$student_lehrverband = [];
|
|
||||||
// for each studiensemester fetch the studentlehrverbaende and add them to an associate $student_lehrverband array
|
|
||||||
/*
|
|
||||||
[
|
|
||||||
['WS2023'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ] ],
|
|
||||||
['SS2024'] => [ [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ] ],
|
|
||||||
['WS2024'] => [ [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ], [ ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ] ],
|
|
||||||
]
|
|
||||||
*/
|
|
||||||
foreach($semester_range as $semester_key => $semester_array)
|
|
||||||
{
|
{
|
||||||
$student_lehrverband[$semester_key] = [];
|
$aktuelle_studiensemester = $this->StudiensemesterModel->getNearest();
|
||||||
foreach($semester_array as $semester => $semester_date_range)
|
if (isError($aktuelle_studiensemester))
|
||||||
{
|
return $aktuelle_studiensemester;
|
||||||
// for each active semester query the student_lehrverband associated to the semester
|
|
||||||
$lehrverband_query = $this->BenutzergruppeModel->execReadOnlyQuery("
|
$aktuelle_studiensemester = getData($aktuelle_studiensemester);
|
||||||
SELECT * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]);
|
if (count($aktuelle_studiensemester) == 0) {
|
||||||
$lehrverband_query_result = $this->getDataOrTerminateWithError($lehrverband_query);
|
return error("No aktuelles semester");
|
||||||
array_push($student_lehrverband[$semester_key], array_map(
|
|
||||||
function ($item) {
|
|
||||||
$result = new stdClass();
|
|
||||||
$result->studiengang_kz = $item->studiengang_kz;
|
|
||||||
$result->semester = $item->semester;
|
|
||||||
$result->verband = $item->verband;
|
|
||||||
$result->gruppe = $item->gruppe;
|
|
||||||
return $result;
|
|
||||||
},
|
|
||||||
$lehrverband_query_result));
|
|
||||||
}
|
}
|
||||||
|
$aktuelle_studiensemester = current($aktuelle_studiensemester)->studiensemester_kurzbz;
|
||||||
|
// push aktuelles semester in active semester array
|
||||||
|
array_push($semester_range, $aktuelle_studiensemester);
|
||||||
}
|
}
|
||||||
|
|
||||||
// merge the studentlehrverband of each studiensemester together for the original studiensemester
|
//auf jeden Fall Semester 2 dazunehmen, wenn nur eines vorhanden ist für Anzeige der ersten Hälfte des folgenden Semesters?
|
||||||
/*
|
if (count($semester_range) == 1)
|
||||||
[
|
{
|
||||||
['WS2023'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""] ],
|
$nextStudiensemester = $this->StudiensemesterModel->getNextFrom($semester_range[0]);
|
||||||
['SS2024'] => [ ['stg_kz'=>298,'semester'=>1,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""] ],
|
if (isError($nextStudiensemester))
|
||||||
['WS2024'] => [ ['stg_kz'=>298,'semester'=>2,'verband'=>"A",'gruppe'=>""], ['stg_kz'=>298,'semester'=>3,'verband'=>"A",'gruppe'=>""] ],
|
return $nextStudiensemester;
|
||||||
]
|
|
||||||
*/
|
|
||||||
$student_lehrverband = array_map(
|
|
||||||
function ($studentlehrverband) {
|
|
||||||
$merged_studentlehrverband = [];
|
|
||||||
foreach($studentlehrverband as $studentlehrverband_array)
|
|
||||||
{
|
|
||||||
$merged_studentlehrverband = array_merge($merged_studentlehrverband, $studentlehrverband_array);
|
|
||||||
}
|
|
||||||
return $merged_studentlehrverband;
|
|
||||||
},
|
|
||||||
$student_lehrverband
|
|
||||||
);
|
|
||||||
|
|
||||||
return $student_lehrverband;
|
$nextStudiensemester = getData($nextStudiensemester);
|
||||||
|
if (count($nextStudiensemester) == 0) {
|
||||||
|
return error("No aktuelles semester");
|
||||||
|
}
|
||||||
|
$nextStudiensemester = current($nextStudiensemester)->studiensemester_kurzbz;
|
||||||
|
// push aktuelles semester in active semester array
|
||||||
|
array_push($semester_range, $nextStudiensemester);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return success($semester_range);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,19 +88,34 @@ class StundenplanLib
|
|||||||
$this->_ci->addMeta('nach_apply_semester_range', $semester_range);
|
$this->_ci->addMeta('nach_apply_semester_range', $semester_range);
|
||||||
if ($function_error)
|
if ($function_error)
|
||||||
return $function_error;
|
return $function_error;
|
||||||
|
|
||||||
|
$this->_ci->addMeta('bhsemtest', print_r($semester_range, true));
|
||||||
|
|
||||||
|
$semester_range = array(
|
||||||
|
'SS2026' => array(
|
||||||
|
'WS2025' => (object) array(
|
||||||
|
'start' => '2026-02-04',
|
||||||
|
'ende' => '2026-05-19'
|
||||||
|
),
|
||||||
|
'SS2026' => (object) array(
|
||||||
|
'start' => '2026-02-04',
|
||||||
|
'ende' => '2026-11-15'
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
// getting the gruppen_kurzbz of the student in the different studiensemester
|
// getting the gruppen_kurzbz of the student in the different studiensemester
|
||||||
$benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range);
|
$benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range);
|
||||||
if (isError($benutzer_gruppen))
|
if (isError($benutzer_gruppen))
|
||||||
return $benutzer_gruppen;
|
return $benutzer_gruppen;
|
||||||
$benutzer_gruppen = getData($benutzer_gruppen);
|
$benutzer_gruppen = getData($benutzer_gruppen);
|
||||||
|
$this->_ci->addMeta('spezialgruppen', $benutzer_gruppen);
|
||||||
// getting the student_lehrverbaende of the student in the different studiensemester
|
// getting the student_lehrverbaende of the student in the different studiensemester
|
||||||
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range);
|
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range);
|
||||||
if (isError($student_lehrverband))
|
if (isError($student_lehrverband))
|
||||||
return $student_lehrverband;
|
return $student_lehrverband;
|
||||||
$student_lehrverband = getData($student_lehrverband);
|
$student_lehrverband = getData($student_lehrverband);
|
||||||
|
$this->_ci->addMeta('studentlehrvebaende', $student_lehrverband);
|
||||||
$stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery(
|
$stundenplan_query = $this->_ci->StundenplanModel->getStundenplanQuery(
|
||||||
$start,
|
$start,
|
||||||
$end,
|
$end,
|
||||||
@@ -632,6 +647,7 @@ class StundenplanLib
|
|||||||
$result->semester = $item->semester;
|
$result->semester = $item->semester;
|
||||||
$result->verband = $item->verband;
|
$result->verband = $item->verband;
|
||||||
$result->gruppe = $item->gruppe;
|
$result->gruppe = $item->gruppe;
|
||||||
|
$result->studiensemester_kurzbz = $item->studiensemester_kurzbz;
|
||||||
return $result;
|
return $result;
|
||||||
},
|
},
|
||||||
$lehrverband_query_result);
|
$lehrverband_query_result);
|
||||||
@@ -667,8 +683,9 @@ class StundenplanLib
|
|||||||
return success($student_lehrverband);
|
return success($student_lehrverband);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function applyLoadUeberSemesterHaelfte(&$semester_range)
|
public function applyLoadUeberSemesterHaelfte(&$semester_range)
|
||||||
{
|
{
|
||||||
|
$this->_ci = &get_instance();
|
||||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -796,8 +813,9 @@ class StundenplanLib
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function studienSemesterErmitteln($start_date, $end_date)
|
public function studienSemesterErmitteln($start_date, $end_date)
|
||||||
{
|
{
|
||||||
|
$this->_ci = &get_instance();
|
||||||
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||||
|
|
||||||
// gets all studiensemester from the student from start_date to end_date
|
// gets all studiensemester from the student from start_date to end_date
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ class StudentListLib
|
|||||||
CASE
|
CASE
|
||||||
WHEN pls.status_kurzbz IN ('Interessent','Aufgenommener','Bewerber','Wartender')
|
WHEN pls.status_kurzbz IN ('Interessent','Aufgenommener','Bewerber','Wartender')
|
||||||
THEN pls.ausbildungssemester
|
THEN pls.ausbildungssemester
|
||||||
ELSE s.semester
|
ELSE v.semester
|
||||||
END AS semester_berechnet
|
END AS semester_berechnet
|
||||||
");
|
");
|
||||||
$this->addSelect(
|
$this->addSelect(
|
||||||
|
|||||||
@@ -28,10 +28,21 @@ class CoreMissingZgvTagLib
|
|||||||
$this->ci->PrestudentModel->addJoin('public.tbl_prestudentstatus', 'prestudent_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_benutzer bn', 'person_id');
|
||||||
$this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
$this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
||||||
|
|
||||||
|
$this->ci->PrestudentModel->db->group_start();
|
||||||
|
|
||||||
|
$this->ci->PrestudentModel->db->where('zgvdatum', null);
|
||||||
|
$this->ci->PrestudentModel->db->where('typ', 'b');
|
||||||
|
|
||||||
|
$this->ci->PrestudentModel->db->or_group_start();
|
||||||
|
$this->ci->PrestudentModel->db->where('zgvmadatum', null);
|
||||||
|
$this->ci->PrestudentModel->db->where('typ', 'm');
|
||||||
|
$this->ci->PrestudentModel->db->group_end();
|
||||||
|
|
||||||
|
$this->ci->PrestudentModel->db->group_end();
|
||||||
|
|
||||||
$result = $this->ci->PrestudentModel-> loadWhere(array(
|
$result = $this->ci->PrestudentModel-> loadWhere(array(
|
||||||
'bn.aktiv' => true, //check if necessary
|
'bn.aktiv' => true,
|
||||||
'zgvdatum' => null,
|
|
||||||
'typ' => 'b',
|
|
||||||
'studiensemester_kurzbz' => $semester
|
'studiensemester_kurzbz' => $semester
|
||||||
));
|
));
|
||||||
|
|
||||||
@@ -60,16 +71,36 @@ class CoreMissingZgvTagLib
|
|||||||
$semester = $params['studiensemester_kurzbz'];
|
$semester = $params['studiensemester_kurzbz'];
|
||||||
$prestudent_id = $params['id'];
|
$prestudent_id = $params['id'];
|
||||||
|
|
||||||
|
$this->ci->PrestudentModel->addSelect('prestudent_id');
|
||||||
|
$this->ci->PrestudentModel->addSelect('start as von');
|
||||||
|
$this->ci->PrestudentModel->addSelect('ende as bis');
|
||||||
$this->ci->PrestudentModel->addJoin('public.tbl_prestudentstatus', 'prestudent_id');
|
$this->ci->PrestudentModel->addJoin('public.tbl_prestudentstatus', 'prestudent_id');
|
||||||
|
|
||||||
|
//add studiensemester also here for manual rebuild
|
||||||
|
$this->ci->PrestudentModel->addJoin('public.tbl_studiensemester', 'studiensemester_kurzbz');
|
||||||
|
|
||||||
$this->ci->PrestudentModel->addJoin('public.tbl_benutzer bn', 'person_id');
|
$this->ci->PrestudentModel->addJoin('public.tbl_benutzer bn', 'person_id');
|
||||||
$this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
$this->ci->PrestudentModel->addJoin('public.tbl_studiengang', 'studiengang_kz');
|
||||||
$result = $this->ci->PrestudentModel->loadWhere(array(
|
|
||||||
'bn.aktiv' => true, //check if necessary
|
$this->ci->PrestudentModel->db->group_start();
|
||||||
'zgvdatum' => null,
|
|
||||||
'typ' => 'b',
|
$this->ci->PrestudentModel->db->where('zgvdatum', null);
|
||||||
|
$this->ci->PrestudentModel->db->where('typ', 'b');
|
||||||
|
|
||||||
|
$this->ci->PrestudentModel->db->or_group_start();
|
||||||
|
$this->ci->PrestudentModel->db->where('zgvmadatum', null);
|
||||||
|
$this->ci->PrestudentModel->db->where('typ', 'm');
|
||||||
|
$this->ci->PrestudentModel->db->group_end();
|
||||||
|
|
||||||
|
$this->ci->PrestudentModel->db->group_end();
|
||||||
|
$this->ci->PrestudentModel->db->limit(1);
|
||||||
|
|
||||||
|
$result = $this->ci->PrestudentModel-> loadWhere(array(
|
||||||
|
'bn.aktiv' => true,
|
||||||
'studiensemester_kurzbz' => $semester,
|
'studiensemester_kurzbz' => $semester,
|
||||||
'prestudent_id' => $prestudent_id
|
'prestudent_id' => $prestudent_id
|
||||||
));
|
));
|
||||||
|
|
||||||
if(hasData($result))
|
if(hasData($result))
|
||||||
{
|
{
|
||||||
return $result;
|
return $result;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
protected $dienstverhaeltnis_id;
|
protected $dienstverhaeltnis_id;
|
||||||
protected $vertragsbestandteil_id;
|
protected $vertragsbestandteil_id;
|
||||||
protected $gehaltstyp_kurzbz;
|
protected $gehaltstyp_kurzbz;
|
||||||
|
protected $gehaltsanpassungtyp_kurzbz = '';
|
||||||
protected $von;
|
protected $von;
|
||||||
protected $bis;
|
protected $bis;
|
||||||
protected $anmerkung;
|
protected $anmerkung;
|
||||||
@@ -21,6 +22,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
protected $valorisierungssperre;
|
protected $valorisierungssperre;
|
||||||
protected $valorisierung;
|
protected $valorisierung;
|
||||||
protected $auszahlungen;
|
protected $auszahlungen;
|
||||||
|
protected $gehaltstyp_bezeichnung;
|
||||||
|
|
||||||
protected $insertamum;
|
protected $insertamum;
|
||||||
protected $insertvon;
|
protected $insertvon;
|
||||||
@@ -39,6 +41,10 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
isset($data->dienstverhaeltnis_id) && $this->setDienstverhaeltnis_id($data->dienstverhaeltnis_id);
|
isset($data->dienstverhaeltnis_id) && $this->setDienstverhaeltnis_id($data->dienstverhaeltnis_id);
|
||||||
isset($data->vertragsbestandteil_id) && $this->setVertragsbestandteil_id($data->vertragsbestandteil_id);
|
isset($data->vertragsbestandteil_id) && $this->setVertragsbestandteil_id($data->vertragsbestandteil_id);
|
||||||
isset($data->gehaltstyp_kurzbz) && $this->setGehaltstyp_kurzbz($data->gehaltstyp_kurzbz);
|
isset($data->gehaltstyp_kurzbz) && $this->setGehaltstyp_kurzbz($data->gehaltstyp_kurzbz);
|
||||||
|
//isset($data->gehaltsanpassungtyp_kurzbz) && $this->setGehaltsanpassungtyp_kurzbz($data->gehaltsanpassungtyp_kurzbz);
|
||||||
|
if (!empty($data->gehaltsanpassungtyp_kurzbz)) {
|
||||||
|
$this->setGehaltsanpassungtyp_kurzbz($data->gehaltsanpassungtyp_kurzbz);
|
||||||
|
}
|
||||||
isset($data->von) && $this->setVon($data->von);
|
isset($data->von) && $this->setVon($data->von);
|
||||||
isset($data->bis) && $this->setBis($data->bis);
|
isset($data->bis) && $this->setBis($data->bis);
|
||||||
isset($data->anmerkung) && $this->setAnmerkung($data->anmerkung);
|
isset($data->anmerkung) && $this->setAnmerkung($data->anmerkung);
|
||||||
@@ -47,7 +53,8 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
isset($data->valorisierungssperre) && $this->setValorisierungssperre($data->valorisierungssperre);
|
isset($data->valorisierungssperre) && $this->setValorisierungssperre($data->valorisierungssperre);
|
||||||
isset($data->valorisierung) && $this->setValorisierung($data->valorisierung);
|
isset($data->valorisierung) && $this->setValorisierung($data->valorisierung);
|
||||||
isset($data->auszahlungen) && $this->setAuszahlungen($data->auszahlungen);
|
isset($data->auszahlungen) && $this->setAuszahlungen($data->auszahlungen);
|
||||||
|
isset($data->gehaltstyp_bezeichnung) && $this->setGehaltstyp_bezeichnung($data->gehaltstyp_bezeichnung);
|
||||||
|
|
||||||
isset($data->insertamum) && $this->setInsertamum($data->insertamum);
|
isset($data->insertamum) && $this->setInsertamum($data->insertamum);
|
||||||
isset($data->insertvon) && $this->setInsertvon($data->insertvon);
|
isset($data->insertvon) && $this->setInsertvon($data->insertvon);
|
||||||
isset($data->updateamum) && $this->setUpdateamum($data->updateamum);
|
isset($data->updateamum) && $this->setUpdateamum($data->updateamum);
|
||||||
@@ -75,6 +82,11 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
return $this->gehaltstyp_kurzbz;
|
return $this->gehaltstyp_kurzbz;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getGehaltsanpassungtyp_kurzbz()
|
||||||
|
{
|
||||||
|
return $this->gehaltsanpassungtyp_kurzbz;
|
||||||
|
}
|
||||||
|
|
||||||
public function getVon()
|
public function getVon()
|
||||||
{
|
{
|
||||||
return $this->von;
|
return $this->von;
|
||||||
@@ -178,6 +190,13 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setGehaltsanpassungtyp_kurzbz($gehaltsanpassungtyp_kurzbz)
|
||||||
|
{
|
||||||
|
$this->markDirty('gehaltsanpassungtyp_kurzbz', $this->gehaltsanpassungtyp_kurzbz, $gehaltsanpassungtyp_kurzbz);
|
||||||
|
$this->gehaltsanpassungtyp_kurzbz = $gehaltsanpassungtyp_kurzbz;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
public function setVon($von)
|
public function setVon($von)
|
||||||
{
|
{
|
||||||
$this->markDirty('von', $this->von, $von);
|
$this->markDirty('von', $this->von, $von);
|
||||||
@@ -206,6 +225,10 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
$grundbetrag = number_format($grundbetrag, 2, '.', '');
|
$grundbetrag = number_format($grundbetrag, 2, '.', '');
|
||||||
}
|
}
|
||||||
$this->markDirty('grundbetrag', $this->grundbetrag, $grundbetrag);
|
$this->markDirty('grundbetrag', $this->grundbetrag, $grundbetrag);
|
||||||
|
if(in_array('grundbetrag', $this->modifiedcolumns))
|
||||||
|
{
|
||||||
|
$this->setBetrag_valorisiert($grundbetrag);
|
||||||
|
}
|
||||||
$this->grundbetrag = $grundbetrag;
|
$this->grundbetrag = $grundbetrag;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@@ -242,6 +265,13 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function setGehaltstyp_bezeichnung($gehaltstyp_bezeichnung)
|
||||||
|
{
|
||||||
|
$this->markDirty('gehaltstyp_bezeichnung', $this->gehaltstyp_bezeichnung, $gehaltstyp_bezeichnung);
|
||||||
|
$this->gehaltstyp_bezeichnung = $gehaltstyp_bezeichnung;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
public function setInsertamum($insertamum)
|
public function setInsertamum($insertamum)
|
||||||
{
|
{
|
||||||
$this->markDirty('insertamum', $this->insertamum, $insertamum);
|
$this->markDirty('insertamum', $this->insertamum, $insertamum);
|
||||||
@@ -284,6 +314,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
'dienstverhaeltnis_id' => $this->getDienstverhaeltnis_id(),
|
'dienstverhaeltnis_id' => $this->getDienstverhaeltnis_id(),
|
||||||
'vertragsbestandteil_id' => $this->getVertragsbestandteil_id(),
|
'vertragsbestandteil_id' => $this->getVertragsbestandteil_id(),
|
||||||
'gehaltstyp_kurzbz' => $this->getGehaltstyp_kurzbz(),
|
'gehaltstyp_kurzbz' => $this->getGehaltstyp_kurzbz(),
|
||||||
|
'gehaltsanpassungtyp_kurzbz' => $this->getGehaltsanpassungtyp_kurzbz(),
|
||||||
'von' => $this->getVon(),
|
'von' => $this->getVon(),
|
||||||
'bis' => $this->getBis(),
|
'bis' => $this->getBis(),
|
||||||
'anmerkung' => $this->getAnmerkung(),
|
'anmerkung' => $this->getAnmerkung(),
|
||||||
@@ -312,6 +343,7 @@ class Gehaltsbestandteil extends AbstractBestandteil implements \JsonSerializabl
|
|||||||
dienstverhaeltnis_id: {$this->getDienstverhaeltnis_id()}
|
dienstverhaeltnis_id: {$this->getDienstverhaeltnis_id()}
|
||||||
vertragsbestandteil_id: {$this->getVertragsbestandteil_id()}
|
vertragsbestandteil_id: {$this->getVertragsbestandteil_id()}
|
||||||
gehaltstyp_kurzbz: {$this->getGehaltstyp_kurzbz()}
|
gehaltstyp_kurzbz: {$this->getGehaltstyp_kurzbz()}
|
||||||
|
gehaltsanpassungtyp_kurzbz: {$this->getGehaltsanpassungtyp_kurzbz()}
|
||||||
von: {$this->getVon()}
|
von: {$this->getVon()}
|
||||||
bis: {$this->getBis()}
|
bis: {$this->getBis()}
|
||||||
anmerkung: {$this->getAnmerkung()}
|
anmerkung: {$this->getAnmerkung()}
|
||||||
|
|||||||
@@ -204,7 +204,7 @@ class Student_model extends DB_Model
|
|||||||
|
|
||||||
Events::trigger(
|
Events::trigger(
|
||||||
'generate_student_uid',
|
'generate_student_uid',
|
||||||
function ($value) use ($uid) {
|
function ($value) use (&$uid) {
|
||||||
$uid = $value;
|
$uid = $value;
|
||||||
},
|
},
|
||||||
$stgkzl,
|
$stgkzl,
|
||||||
|
|||||||
@@ -457,6 +457,7 @@ class Studiengang_model extends DB_Model
|
|||||||
*/
|
*/
|
||||||
public function getLeitung($studiengang_kz = null)
|
public function getLeitung($studiengang_kz = null)
|
||||||
{
|
{
|
||||||
|
$this->addDistinct();
|
||||||
$this->addSelect('uid, studiengang_kz, oe_kurzbz, vorname, nachname, email, titelpre, titelpost, alias');
|
$this->addSelect('uid, studiengang_kz, oe_kurzbz, vorname, nachname, email, titelpre, titelpost, alias');
|
||||||
$this->addJoin('public.tbl_benutzerfunktion', 'oe_kurzbz');
|
$this->addJoin('public.tbl_benutzerfunktion', 'oe_kurzbz');
|
||||||
$this->addJoin('public.tbl_benutzer', 'uid');
|
$this->addJoin('public.tbl_benutzer', 'uid');
|
||||||
|
|||||||
@@ -193,7 +193,8 @@ class Stundenplan_model extends DB_Model
|
|||||||
*/
|
*/
|
||||||
public function stundenplanGruppierungConsecutive($stundenplanViewQuery)
|
public function stundenplanGruppierungConsecutive($stundenplanViewQuery)
|
||||||
{
|
{
|
||||||
$query_result = $this->execReadOnlyQuery("
|
$query_result = $this->execReadOnlyQuery(
|
||||||
|
$stundenplanViewQuery . "
|
||||||
SELECT
|
SELECT
|
||||||
distinct lehrveranstaltung_id,
|
distinct lehrveranstaltung_id,
|
||||||
datum,
|
datum,
|
||||||
@@ -247,7 +248,7 @@ class Stundenplan_model extends DB_Model
|
|||||||
anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz,
|
anmerkung_lehreinheit,gruppe, verband, semester,stg_kurzbz,
|
||||||
CONCAT(p.nachname, ' ', p.vorname) as lektorname
|
CONCAT(p.nachname, ' ', p.vorname) as lektorname
|
||||||
|
|
||||||
FROM (".$stundenplanViewQuery.") sp
|
FROM stundenplaneintraege sp
|
||||||
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
|
JOIN lehre.tbl_stunde ON lehre.tbl_stunde.stunde = sp.stunde
|
||||||
LEFT JOIN public.tbl_benutzer bn ON bn.uid = sp.uid
|
LEFT JOIN public.tbl_benutzer bn ON bn.uid = sp.uid
|
||||||
LEFT JOIN public.tbl_person p ON p.person_id = bn.person_id
|
LEFT JOIN public.tbl_person p ON p.person_id = bn.person_id
|
||||||
@@ -280,7 +281,7 @@ class Stundenplan_model extends DB_Model
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* queries Stundenplan but for a whole lva, irrespective of who is requesting it
|
* queries Stundenplan but for a whole lva, irrespective of who is requesting it
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function getStundenplanLVA($start_date, $end_date, $lv_id) {
|
public function getStundenplanLVA($start_date, $end_date, $lv_id) {
|
||||||
@@ -528,7 +529,96 @@ class Stundenplan_model extends DB_Model
|
|||||||
|
|
||||||
return $this->execReadOnlyQuery($qry, $qry_params);
|
return $this->execReadOnlyQuery($qry, $qry_params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function genLehrverbandClauses($semester, $studentlehrverbaende)
|
||||||
|
{
|
||||||
|
$lvbdclauses = array();
|
||||||
|
$studiengang_kz = null;
|
||||||
|
foreach($semester as $sem=>$semester_date_range)
|
||||||
|
{
|
||||||
|
foreach($semester_date_range as $sem_date => $sem_date_range)
|
||||||
|
{
|
||||||
|
if(!array_key_exists($sem,$studentlehrverbaende) || count($studentlehrverbaende[$sem]) == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$studlvbds = array_filter(
|
||||||
|
$studentlehrverbaende[$sem],
|
||||||
|
function($value) use ($sem_date) {
|
||||||
|
return $value->studiensemester_kurzbz === $sem_date;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
foreach($studlvbds as $key=>$lehrverband)
|
||||||
|
{
|
||||||
|
$studiengang_kz = $lehrverband->studiengang_kz;
|
||||||
|
$lvbdclauses[] = <<<EOCLAUSE
|
||||||
|
(
|
||||||
|
{$this->escape($lehrverband->verbandsgruppe)} like sp.verbandsgruppe || '%'
|
||||||
|
and sp.datum between {$this->escape($sem_date_range->start)} and {$this->escape($sem_date_range->ende)}
|
||||||
|
and (sp.studiensemester_kurzbz is null or sp.studiensemester_kurzbz = {$this->escape($lehrverband->query_studiensemester_kurzbz)})
|
||||||
|
)
|
||||||
|
EOCLAUSE;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$sql = implode(PHP_EOL . " OR" . PHP_EOL, $lvbdclauses);
|
||||||
|
if($sql)
|
||||||
|
{
|
||||||
|
$sql = <<<EOSQL
|
||||||
|
(
|
||||||
|
sp.studiengang_kz = {$this->escape($studiengang_kz)}
|
||||||
|
and
|
||||||
|
sp.gruppe_kurzbz is null
|
||||||
|
and
|
||||||
|
(
|
||||||
|
{$sql}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
EOSQL;
|
||||||
|
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function genSpezialgruppenClauses($semester, $gruppen)
|
||||||
|
{
|
||||||
|
$spezgrpclauses = array();
|
||||||
|
foreach($semester as $sem => $semester_date_range)
|
||||||
|
{
|
||||||
|
|
||||||
|
foreach($semester_date_range as $sem_date => $sem_date_range)
|
||||||
|
{
|
||||||
|
// if there are not groups for the semester skip the iteration step
|
||||||
|
if(!array_key_exists($sem_date,$gruppen) || count($gruppen[$sem_date]) == 0)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// converts the array of gruppen strings into a sql IN (_,_,_) chain
|
||||||
|
$groups = implode(', ', $gruppen[$sem_date]);
|
||||||
|
$spezgrpclauses[] = <<<EOSPEZGRP
|
||||||
|
(
|
||||||
|
sp.gruppe_kurzbz IN ({$groups})
|
||||||
|
AND sp.datum BETWEEN {$this->escape($sem_date_range->start)} AND {$this->escape($sem_date_range->ende)}
|
||||||
|
)
|
||||||
|
EOSPEZGRP;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$sql = implode(PHP_EOL . " OR" . PHP_EOL, $spezgrpclauses);
|
||||||
|
if($sql)
|
||||||
|
{
|
||||||
|
$sql = <<<EOSQL
|
||||||
|
(
|
||||||
|
{$sql}
|
||||||
|
)
|
||||||
|
EOSQL;
|
||||||
|
}
|
||||||
|
return $sql;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
|
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
|
||||||
*
|
*
|
||||||
@@ -537,8 +627,8 @@ class Stundenplan_model extends DB_Model
|
|||||||
*
|
*
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
public function getStundenplanQuery($start_date, $end_date, $semester, $gruppen, $studentlehrverbaende, $isLvList=false, $db_stpl_table='stundenplan'){
|
public function getStundenplanQuery($start_date, $end_date, $semester, $gruppen, $studentlehrverbaende, $db_stpl_table='stundenplan', $showLvsStundenplan=false, $endDateNextSemHalf=null, $semesterFilter=null)
|
||||||
|
{
|
||||||
// helper function to check if either $gruppen or $studentlehrverbaende are empty for each semester
|
// helper function to check if either $gruppen or $studentlehrverbaende are empty for each semester
|
||||||
$emptyCheck = function($toBeCheckedArray) use ($semester){
|
$emptyCheck = function($toBeCheckedArray) use ($semester){
|
||||||
$result = true;
|
$result = true;
|
||||||
@@ -552,87 +642,42 @@ class Stundenplan_model extends DB_Model
|
|||||||
return $result;
|
return $result;
|
||||||
};
|
};
|
||||||
|
|
||||||
// if both the gruppen and the studentlehrverbaende are empty we early return
|
// if both the gruppen and the studentlehrverbaende are empty we early return
|
||||||
if($emptyCheck($gruppen) && $emptyCheck($studentlehrverbaende))
|
if($emptyCheck($gruppen) && $emptyCheck($studentlehrverbaende))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$query =
|
$lvbdclauses = $this->genLehrverbandClauses($semester, $studentlehrverbaende);
|
||||||
"select sp.*
|
$spezgrpclauses = $this->genSpezialgruppenClauses($semester, $gruppen);
|
||||||
from lehre.vw_".$db_stpl_table." sp
|
$chainingor = ($lvbdclauses && $spezgrpclauses) ? 'OR' : '';
|
||||||
WHERE
|
|
||||||
sp.datum >= ".$this->escape($start_date)."
|
|
||||||
AND sp.datum <= ".$this->escape($end_date);
|
|
||||||
|
|
||||||
// adds the AND sql chain only if both $gruppen and $studentlehrverbaende are not empty
|
|
||||||
if(!$emptyCheck($gruppen) || !$emptyCheck($studentlehrverbaende))
|
|
||||||
{
|
|
||||||
$query .= " AND ( ";
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach($semester as $sem => $semester_date_range)
|
$query = <<<EOSQL
|
||||||
{
|
with preprocessedsp as (
|
||||||
|
select
|
||||||
|
(UPPER(sp.stg_typ || sp.stg_kurzbz)) || sp.semester || sp.verband || sp.gruppe as verbandsgruppe,
|
||||||
|
sp.*,
|
||||||
|
le.studiensemester_kurzbz
|
||||||
|
from
|
||||||
|
lehre.vw_stundenplan sp
|
||||||
|
join
|
||||||
|
lehre.tbl_lehreinheit le on sp.lehreinheit_id = le.lehreinheit_id
|
||||||
|
where
|
||||||
|
sp.datum >= {$this->escape($start_date)}
|
||||||
|
and sp.datum <= {$this->escape($end_date)}
|
||||||
|
),
|
||||||
|
stundenplaneintraege as (
|
||||||
|
select
|
||||||
|
sp.*
|
||||||
|
from
|
||||||
|
preprocessedsp sp
|
||||||
|
where
|
||||||
|
{$lvbdclauses}
|
||||||
|
{$chainingor}
|
||||||
|
{$spezgrpclauses}
|
||||||
|
)
|
||||||
|
|
||||||
foreach($semester_date_range as $sem_date => $sem_date_range)
|
EOSQL;
|
||||||
{
|
|
||||||
// if there are not groups for the semester skip the iteration step
|
|
||||||
if(!array_key_exists($sem_date,$gruppen) || count($gruppen[$sem_date]) == 0)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// converts the array of gruppen strings into a sql IN (_,_,_) chain
|
|
||||||
$query .="(sp.gruppe_kurzbz IN (" .implode(',',$gruppen[$sem_date]).") AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende)." )";
|
|
||||||
|
|
||||||
$query .="OR";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if there are no studentlehrverbaende and the gruppen are not empty, we can remove the last OR added after the groups
|
|
||||||
if($emptyCheck($studentlehrverbaende) && !$emptyCheck($gruppen))
|
|
||||||
{
|
|
||||||
$query = substr($query, 0, -2);
|
|
||||||
}
|
|
||||||
|
|
||||||
//Condition for showLVList FHC4
|
|
||||||
if(!$isLvList)
|
|
||||||
$stringGroupLv = "AND gruppe_kurzbz is null";
|
|
||||||
else
|
|
||||||
$stringGroupLv ="";
|
|
||||||
|
|
||||||
foreach($semester as $sem=>$semester_date_range)
|
|
||||||
{
|
|
||||||
foreach($semester_date_range as $sem_date => $sem_date_range)
|
|
||||||
{
|
|
||||||
if(!array_key_exists($sem_date,$studentlehrverbaende) || count($studentlehrverbaende[$sem_date]) == 0)
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
foreach($studentlehrverbaende[$sem_date] as $key=>$lehrverband)
|
|
||||||
{
|
|
||||||
$query .= "(((sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND sp.gruppe = ".$this->escape($lehrverband->gruppe)." AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
|
|
||||||
// Eintraege fuer den ganzen Verband
|
|
||||||
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND sp.verband = ".$this->escape($lehrverband->verband)." AND (sp.gruppe is null OR sp.gruppe='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)." AND ".$this->escape($sem_date_range->ende).")";
|
|
||||||
// Eintraege fuer das ganze Semester
|
|
||||||
$query .= "OR (sp.studiengang_kz = ".$this->escape($lehrverband->studiengang_kz)." AND sp.semester = ".$this->escape($lehrverband->semester)." AND (sp.verband is null OR sp.verband='') AND sp.datum BETWEEN ".$this->escape($sem_date_range->start)
|
|
||||||
." AND ".$this->escape($sem_date_range->ende).")) AND gruppe_kurzbz is null)";
|
|
||||||
|
|
||||||
$query .="OR";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if the studentlehrverbaende is not empty we can remove the last OR that was added to the query
|
|
||||||
if(!$emptyCheck($studentlehrverbaende))
|
|
||||||
{
|
|
||||||
$query = substr($query, 0, -2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// closes the AND sql chain only if it was opened previously
|
|
||||||
if(!$emptyCheck($gruppen) || !$emptyCheck($studentlehrverbaende))
|
|
||||||
{
|
|
||||||
$query .= ")";
|
|
||||||
}
|
|
||||||
|
|
||||||
return $query;
|
return $query;
|
||||||
}
|
}
|
||||||
@@ -724,4 +769,4 @@ class Stundenplan_model extends DB_Model
|
|||||||
|
|
||||||
return $this->execQuery($qry, [$lehrveranstaltung_id, $studiensemester_kurzbz]);
|
return $this->execQuery($qry, [$lehrveranstaltung_id, $studiensemester_kurzbz]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -41,6 +41,7 @@ with gbt as (
|
|||||||
gb.anmerkung,
|
gb.anmerkung,
|
||||||
gb.dienstverhaeltnis_id,
|
gb.dienstverhaeltnis_id,
|
||||||
gb.gehaltstyp_kurzbz,
|
gb.gehaltstyp_kurzbz,
|
||||||
|
gb.gehaltsanpassungtyp_kurzbz,
|
||||||
gb.valorisierungssperre,
|
gb.valorisierungssperre,
|
||||||
gb.valorisierung,
|
gb.valorisierung,
|
||||||
gb.grundbetrag as grund_betrag_decrypted,
|
gb.grundbetrag as grund_betrag_decrypted,
|
||||||
@@ -76,11 +77,13 @@ select
|
|||||||
gbt.anmerkung,
|
gbt.anmerkung,
|
||||||
gbt.dienstverhaeltnis_id,
|
gbt.dienstverhaeltnis_id,
|
||||||
gbt.gehaltstyp_kurzbz,
|
gbt.gehaltstyp_kurzbz,
|
||||||
|
gbt.gehaltsanpassungtyp_kurzbz,
|
||||||
gbt.valorisierungssperre,
|
gbt.valorisierungssperre,
|
||||||
gbt.valorisierung,
|
gbt.valorisierung,
|
||||||
gbt.grund_betrag_decrypted,
|
gbt.grund_betrag_decrypted,
|
||||||
gbt.betrag_val_decrypted,
|
gbt.betrag_val_decrypted,
|
||||||
gt.bezeichnung as gehaltstyp_bezeichnung,
|
gt.bezeichnung as gehaltstyp_bezeichnung,
|
||||||
|
ga.bezeichnung as gehaltsanpassungtyp_bezeichnung,
|
||||||
vb.vertragsbestandteiltyp_kurzbz,
|
vb.vertragsbestandteiltyp_kurzbz,
|
||||||
bf.funktion_kurzbz,
|
bf.funktion_kurzbz,
|
||||||
bf.oe_kurzbz,
|
bf.oe_kurzbz,
|
||||||
@@ -93,6 +96,8 @@ from
|
|||||||
gbt
|
gbt
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz)
|
hr.tbl_gehaltstyp gt using(gehaltstyp_kurzbz)
|
||||||
|
LEFT JOIN
|
||||||
|
hr.tbl_gehaltsanpassungtyp ga using(gehaltsanpassungtyp_kurzbz)
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id)
|
hr.tbl_vertragsbestandteil vb using(vertragsbestandteil_id)
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
@@ -177,7 +182,8 @@ LEFT JOIN
|
|||||||
$stichtagclause .= ')';
|
$stichtagclause .= ')';
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->addSelect('*');
|
$this->addSelect('tbl_gehaltsbestandteil.*, tbl_gehaltstyp.bezeichnung AS gehaltstyp_bezeichnung');
|
||||||
|
$this->addJoin('hr.tbl_gehaltstyp', 'gehaltstyp_kurzbz');
|
||||||
$where = <<<EOSQL
|
$where = <<<EOSQL
|
||||||
dienstverhaeltnis_id = {$this->escape($dienstverhaeltnis_id)}
|
dienstverhaeltnis_id = {$this->escape($dienstverhaeltnis_id)}
|
||||||
{$stichtagclause}
|
{$stichtagclause}
|
||||||
@@ -202,6 +208,7 @@ SELECT
|
|||||||
g.dienstverhaeltnis_id,
|
g.dienstverhaeltnis_id,
|
||||||
g.vertragsbestandteil_id,
|
g.vertragsbestandteil_id,
|
||||||
g.gehaltstyp_kurzbz,
|
g.gehaltstyp_kurzbz,
|
||||||
|
g.gehaltsanpassungtyp_kurzbz,
|
||||||
g.von,
|
g.von,
|
||||||
g.bis,
|
g.bis,
|
||||||
g.anmerkung,
|
g.anmerkung,
|
||||||
@@ -213,9 +220,11 @@ SELECT
|
|||||||
g.updateamum,
|
g.updateamum,
|
||||||
g.updatevon,
|
g.updatevon,
|
||||||
g.valorisierung,
|
g.valorisierung,
|
||||||
g.auszahlungen
|
g.auszahlungen,
|
||||||
|
gt.bezeichnung AS gehaltstyp_bezeichnung
|
||||||
FROM
|
FROM
|
||||||
hr.tbl_gehaltsbestandteil g
|
hr.tbl_gehaltsbestandteil g
|
||||||
|
JOIN hr.tbl_gehaltstyp gt USING (gehaltstyp_kurzbz)
|
||||||
LEFT JOIN
|
LEFT JOIN
|
||||||
hr.tbl_valorisierung_historie vh ON vh.gehaltsbestandteil_id = g.gehaltsbestandteil_id AND vh.valorisierungsdatum = (
|
hr.tbl_valorisierung_historie vh ON vh.gehaltsbestandteil_id = g.gehaltsbestandteil_id AND vh.valorisierungsdatum = (
|
||||||
SELECT
|
SELECT
|
||||||
@@ -263,7 +272,7 @@ EOSQL;
|
|||||||
// Note: replaced gb.betrag_valorisiert with vh.betrag_valorisiert!
|
// Note: replaced gb.betrag_valorisiert with vh.betrag_valorisiert!
|
||||||
$qry = "
|
$qry = "
|
||||||
SELECT
|
SELECT
|
||||||
gb.gehaltsbestandteil_id,gb.dienstverhaeltnis_id,gb.vertragsbestandteil_id,gb.gehaltstyp_kurzbz,
|
gb.gehaltsbestandteil_id,gb.dienstverhaeltnis_id,gb.vertragsbestandteil_id,gb.gehaltstyp_kurzbz,gb.gehaltsanpassungtyp_kurzbz,
|
||||||
gb.von,gb.bis,gb.anmerkung,gb.grundbetrag as grundbetrag,gb.valorisierungssperre,gb.insertamum,
|
gb.von,gb.bis,gb.anmerkung,gb.grundbetrag as grundbetrag,gb.valorisierungssperre,gb.insertamum,
|
||||||
gb.insertvon,gb.updateamum,gb.updatevon,gb.valorisierung,gb.auszahlungen,
|
gb.insertvon,gb.updateamum,gb.updatevon,gb.valorisierung,gb.auszahlungen,
|
||||||
vh.valorisierungsdatum, vh.betrag_valorisiert as betrag_valorisiert
|
vh.valorisierungsdatum, vh.betrag_valorisiert as betrag_valorisiert
|
||||||
|
|||||||
@@ -62,3 +62,16 @@
|
|||||||
top:13%;"
|
top:13%;"
|
||||||
z-index: 104; font-size: 1rem; width: 2.5rem; height: 2.5rem; opacity:0; transition: opacity 0.2s; top:13%;"
|
z-index: 104; font-size: 1rem; width: 2.5rem; height: 2.5rem; opacity:0; transition: opacity 0.2s; top:13%;"
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
.tag-hover:hover {
|
||||||
|
background-color: #e9ecef;
|
||||||
|
}
|
||||||
|
|
||||||
|
.green {
|
||||||
|
background-color: #e9ecef;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-hover {
|
||||||
|
--bs-btn-hover-bg: #e9ecef; /* Neue Hintergrundfarbe beim Hover */
|
||||||
|
--bs-btn-hover-border-color: #e9ecef; /* Neue Rahmenfarbe beim Hover */
|
||||||
|
}
|
||||||
|
|||||||
@@ -145,3 +145,8 @@
|
|||||||
float: right;
|
float: right;
|
||||||
margin-top: 3px;
|
margin-top: 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.btn-hover {
|
||||||
|
--bs-btn-hover-bg: #e9ecef;
|
||||||
|
--bs-btn-hover-border-color: #e9ecef;
|
||||||
|
}
|
||||||
|
|||||||
@@ -26,6 +26,15 @@ export default {
|
|||||||
+ encodeURIComponent(true)
|
+ encodeURIComponent(true)
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
getCourselistByStudiensemester(student_uid, studiensemester_kurzbz, stundenplan) {
|
||||||
|
return {
|
||||||
|
method: 'get',
|
||||||
|
url: 'api/frontend/v1/stv/LvTermine/getStundenplanForStudiensemester/' + encodeURIComponent(student_uid) + '/'
|
||||||
|
+ encodeURIComponent(studiensemester_kurzbz) + '/'
|
||||||
|
+ encodeURIComponent(stundenplan) + '/'
|
||||||
|
+ encodeURIComponent(true)
|
||||||
|
};
|
||||||
|
},
|
||||||
exportCalendar(student_uid, stundenplan)
|
exportCalendar(student_uid, stundenplan)
|
||||||
{
|
{
|
||||||
return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'content/statistik/termine.xls.php?student_uid=' + encodeURIComponent(student_uid) + '&db_stpl_table='+encodeURIComponent(stundenplan);
|
return FHC_JS_DATA_STORAGE_OBJECT.app_root + 'content/statistik/termine.xls.php?student_uid=' + encodeURIComponent(student_uid) + '&db_stpl_table='+encodeURIComponent(stundenplan);
|
||||||
|
|||||||
@@ -174,6 +174,9 @@ export default {
|
|||||||
>
|
>
|
||||||
{{ $p.t('lehre/noLvFound') }}
|
{{ $p.t('lehre/noLvFound') }}
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="!renderers || !renderers[event.type]" class="placeholder-glow">
|
||||||
|
<span class="placeholder col-12"></span>
|
||||||
|
</div>
|
||||||
<div
|
<div
|
||||||
v-else
|
v-else
|
||||||
:class="'event-type-' + event.type + ' ' + mode + 'PageContainer'"
|
:class="'event-type-' + event.type + ' ' + mode + 'PageContainer'"
|
||||||
|
|||||||
@@ -79,6 +79,9 @@ export default {
|
|||||||
>
|
>
|
||||||
{{ $p.t('lehre/noLvFound') }}
|
{{ $p.t('lehre/noLvFound') }}
|
||||||
</div>
|
</div>
|
||||||
|
<div v-else-if="!renderers || !renderers[event.type]" class="placeholder-glow">
|
||||||
|
<span class="placeholder col-12"></span>
|
||||||
|
</div>
|
||||||
<component
|
<component
|
||||||
v-else-if="mode == 'eventheader'"
|
v-else-if="mode == 'eventheader'"
|
||||||
:is="renderers[event.type]?.modalTitle"
|
:is="renderers[event.type]?.modalTitle"
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ export default {
|
|||||||
listGroup: [],
|
listGroup: [],
|
||||||
rangeIntervalFirst: null,
|
rangeIntervalFirst: null,
|
||||||
otherPersonData: {
|
otherPersonData: {
|
||||||
fullName: "",
|
fullNameWithTitle: "",
|
||||||
photo: "",
|
photo: "",
|
||||||
},
|
},
|
||||||
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
timezone: FHC_JS_DATA_STORAGE_OBJECT.timezone,
|
||||||
@@ -210,10 +210,17 @@ export default {
|
|||||||
this.isOtherPersonMitarbeiter =
|
this.isOtherPersonMitarbeiter =
|
||||||
!!viewData?.user_data?.is_mitarbeiter;
|
!!viewData?.user_data?.is_mitarbeiter;
|
||||||
this.isOtherPersonStudent = !!viewData?.user_data?.is_student;
|
this.isOtherPersonStudent = !!viewData?.user_data?.is_student;
|
||||||
this.otherPersonData.fullName =
|
let fullNameWithTitleFragments = [
|
||||||
viewData?.user_data?.vorname +
|
viewData?.user_data?.titel,
|
||||||
" " +
|
viewData?.user_data?.vorname,
|
||||||
viewData?.user_data?.nachname;
|
viewData?.user_data?.nachname,
|
||||||
|
viewData?.user_data?.postnomen,
|
||||||
|
];
|
||||||
|
fullNameWithTitleFragments = fullNameWithTitleFragments.filter(
|
||||||
|
(fragment) => !!fragment,
|
||||||
|
);
|
||||||
|
this.otherPersonData.fullNameWithTitle =
|
||||||
|
fullNameWithTitleFragments.join(" ");
|
||||||
this.otherPersonData.photo = viewData?.user_data?.foto;
|
this.otherPersonData.photo = viewData?.user_data?.foto;
|
||||||
},
|
},
|
||||||
async redirectToMyLvPlanIfAuthUid() {
|
async redirectToMyLvPlanIfAuthUid() {
|
||||||
@@ -225,12 +232,21 @@ export default {
|
|||||||
this.$router.push({ name: "MyLvPlan" });
|
this.$router.push({ name: "MyLvPlan" });
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
copyFullNameWithTitleToClipboard() {
|
||||||
|
navigator.clipboard.writeText(
|
||||||
|
this.otherPersonData.fullNameWithTitle,
|
||||||
|
);
|
||||||
|
this.$fhcAlert.alertSuccess(
|
||||||
|
this.$p.t("profil/name_title_clipboard_copy_confirmation"),
|
||||||
|
);
|
||||||
|
},
|
||||||
},
|
},
|
||||||
async created() {
|
async created() {
|
||||||
await this.redirectToMyLvPlanIfAuthUid();
|
await this.redirectToMyLvPlanIfAuthUid();
|
||||||
await this.fetchViewData();
|
await this.fetchViewData();
|
||||||
|
await this.$p.loadCategory(["profil"]);
|
||||||
},
|
},
|
||||||
template: `
|
template: /*html*/ `
|
||||||
<div class="d-flex flex-column h-100">
|
<div class="d-flex flex-column h-100">
|
||||||
<h2>
|
<h2>
|
||||||
<div class="d-flex flex-row justify-content-between align-items-center">
|
<div class="d-flex flex-row justify-content-between align-items-center">
|
||||||
@@ -238,8 +254,11 @@ export default {
|
|||||||
{{ $p.t('lehre/stundenplan') + (studiensemester_kurzbz ? " " + studiensemester_kurzbz : "") }}
|
{{ $p.t('lehre/stundenplan') + (studiensemester_kurzbz ? " " + studiensemester_kurzbz : "") }}
|
||||||
</span>
|
</span>
|
||||||
<div @click="this.$router.push({name: 'ProfilView', params: {uid: propsViewData.otherUid}})" type="button" class="d-flex flex-row align-items-center gap-3">
|
<div @click="this.$router.push({name: 'ProfilView', params: {uid: propsViewData.otherUid}})" type="button" class="d-flex flex-row align-items-center gap-3">
|
||||||
<span v-if="otherPersonData.fullName?.length">
|
<span v-if="otherPersonData.fullNameWithTitle?.length">
|
||||||
{{ otherPersonData.fullName }}
|
{{ otherPersonData.fullNameWithTitle }}
|
||||||
|
<span @click.stop="copyFullNameWithTitleToClipboard()" :title="$p.t('LvPlan/copy')" class="fs-4 h-100">
|
||||||
|
<i class="fa-regular fa-copy"></i>
|
||||||
|
</span>
|
||||||
</span>
|
</span>
|
||||||
<img v-if="otherPersonData.photo?.length" alt="profile picture" class=" img-thumbnail " style=" max-height:60px; " :src="get_image_base64_src"/>
|
<img v-if="otherPersonData.photo?.length" alt="profile picture" class=" img-thumbnail " style=" max-height:60px; " :src="get_image_base64_src"/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -67,6 +67,21 @@ export default {
|
|||||||
return res;
|
return res;
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
methods: {
|
||||||
|
copyFullNameWithTitleToClipboard() {
|
||||||
|
let fragments = [
|
||||||
|
this.$props.data.Titel,
|
||||||
|
this.$props.data.Vorname,
|
||||||
|
this.$props.data.Nachname,
|
||||||
|
this.$props.data.Postnomen,
|
||||||
|
];
|
||||||
|
fragments = fragments.filter((fragment) => !!fragment);
|
||||||
|
navigator.clipboard.writeText(fragments.join(" "));
|
||||||
|
this.$fhcAlert.alertSuccess(
|
||||||
|
this.$p.t("profil/name_title_clipboard_copy_confirmation"),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
},
|
||||||
template: /*html*/ `
|
template: /*html*/ `
|
||||||
|
|
||||||
<div class="card h-100">
|
<div class="card h-100">
|
||||||
@@ -124,6 +139,16 @@ export default {
|
|||||||
<span class="form-underline-content">{{wert?wert:'-'}} </span>
|
<span class="form-underline-content">{{wert?wert:'-'}} </span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<a
|
||||||
|
@click="copyFullNameWithTitleToClipboard()"
|
||||||
|
href="#"
|
||||||
|
class="col-12 fhc-link-color d-flex flex-row gap-2 align-items-center justify-content-center mt-3"
|
||||||
|
>
|
||||||
|
<span>
|
||||||
|
<i class="fa-regular fa-copy ms-2 text-decoration-none"></i>
|
||||||
|
</span>
|
||||||
|
<span>{{ $p.t("profil/name_title_copy") }}</span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -51,6 +51,16 @@ export default {
|
|||||||
return numberPadding(this.event.ende.getHours()) + ":" + numberPadding(this.event.ende.getMinutes());
|
return numberPadding(this.event.ende.getHours()) + ":" + numberPadding(this.event.ende.getMinutes());
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
watch: {
|
||||||
|
event: {
|
||||||
|
async handler() {
|
||||||
|
if (this.$props.event.type == "lehreinheit") {
|
||||||
|
await this.getLvMenu();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
deep: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
mehtodNumberPadding: function (number) {
|
mehtodNumberPadding: function (number) {
|
||||||
return numberPadding(number);
|
return numberPadding(number);
|
||||||
@@ -58,21 +68,31 @@ export default {
|
|||||||
methodFormatDate: function (d) {
|
methodFormatDate: function (d) {
|
||||||
return formatDate(d);
|
return formatDate(d);
|
||||||
},
|
},
|
||||||
|
async getLvMenu() {
|
||||||
|
const semesterResponse = await this.$api.call(
|
||||||
|
ApiLvPlan.getLehreinheitStudiensemester(
|
||||||
|
Array.isArray(this.event.lehreinheit_id)
|
||||||
|
? this.event.lehreinheit_id[0]
|
||||||
|
: this.event.lehreinheit_id,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if (semesterResponse.meta.status !== "success") return;
|
||||||
|
|
||||||
|
const studiensemesterKurzbz = semesterResponse.data;
|
||||||
|
const lvMenuResponse = await this.$api.call(
|
||||||
|
ApiAddons.getLvMenu(
|
||||||
|
this.event.lehrveranstaltung_id,
|
||||||
|
studiensemesterKurzbz,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
if (lvMenuResponse.meta.status !== "success") return;
|
||||||
|
|
||||||
|
this.lvMenu = lvMenuResponse.data;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
created() {
|
async created() {
|
||||||
if (this.event.type == 'lehreinheit') {
|
if (this.$props.event.type == 'lehreinheit') {
|
||||||
this.$api
|
await this.getLvMenu();
|
||||||
.call(ApiLvPlan.getLehreinheitStudiensemester(Array.isArray(this.event.lehreinheit_id) ? this.event.lehreinheit_id[0] : this.event.lehreinheit_id))
|
|
||||||
.then(res => res.data)
|
|
||||||
.then(studiensemester_kurzbz => this.$api.call(
|
|
||||||
ApiAddons.getLvMenu(
|
|
||||||
this.event.lehrveranstaltung_id,
|
|
||||||
studiensemester_kurzbz
|
|
||||||
)
|
|
||||||
))
|
|
||||||
.then(res => {
|
|
||||||
this.lvMenu = res.data;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
template: `
|
template: `
|
||||||
|
|||||||
@@ -381,13 +381,13 @@ export default {
|
|||||||
<template v-for="lehrveranstaltung in lehrveranstaltungen" :key="lehrveranstaltung.lehrveranstaltung_id">
|
<template v-for="lehrveranstaltung in lehrveranstaltungen" :key="lehrveranstaltung.lehrveranstaltung_id">
|
||||||
<div class="card" v-if="Array.isArray(lehrveranstaltung.lehrveranstaltungen) && lehrveranstaltung.lehrveranstaltungen.length >0" >
|
<div class="card" v-if="Array.isArray(lehrveranstaltung.lehrveranstaltungen) && lehrveranstaltung.lehrveranstaltungen.length >0" >
|
||||||
<div class="card-header">
|
<div class="card-header">
|
||||||
<h5 class=" card-title">{{isGermanLanguage == 'German' ? lehrveranstaltung.bezeichnung : lehrveranstaltung.bezeichnung_english }}</h5>
|
<h5 class=" card-title">{{isGermanLanguage ? lehrveranstaltung.bezeichnung : lehrveranstaltung.bezeichnung_english }}</h5>
|
||||||
<h6 class=" card-subtitle">{{lehrveranstaltung.lehrform_kurzbz}}</h6>
|
<h6 class=" card-subtitle">{{lehrveranstaltung.lehrform_kurzbz}}</h6>
|
||||||
</div>
|
</div>
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<ul class="list-group list-group-flush">
|
<ul class="list-group list-group-flush">
|
||||||
<li class="d-flex list-group-item" v-for="lv in lehrveranstaltung.lehrveranstaltungen">
|
<li class="d-flex list-group-item" v-for="lv in lehrveranstaltung.lehrveranstaltungen">
|
||||||
<a class="fhc-link-color d-block me-auto" href="#" @click="openLvUebersicht(lv)">{{isGermanLanguage == 'German' ? lv.bezeichnung : lv.bezeichnung_english}}</a>
|
<a class="fhc-link-color d-block me-auto" href="#" @click="openLvUebersicht(lv)">{{isGermanLanguage ? lv.bezeichnung : lv.bezeichnung_english}}</a>
|
||||||
<p>{{lv.lehrform_kurzbz}}</p>
|
<p>{{lv.lehrform_kurzbz}}</p>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -62,6 +62,9 @@ export default {
|
|||||||
|
|
||||||
return [type, result];
|
return [type, result];
|
||||||
}));
|
}));
|
||||||
|
},
|
||||||
|
hiddenWidgets() {
|
||||||
|
return this.widgets.filter(widget => widget.hidden);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -69,6 +72,9 @@ export default {
|
|||||||
this.$refs.widgetpicker
|
this.$refs.widgetpicker
|
||||||
.getWidget()
|
.getWidget()
|
||||||
.then(widget_id => {
|
.then(widget_id => {
|
||||||
|
if (widget_id.hidden)
|
||||||
|
this.widgetUnhide(widget_id, widget.place);
|
||||||
|
|
||||||
widget.widget = widget_id;
|
widget.widget = widget_id;
|
||||||
// NOTE(chris): min size
|
// NOTE(chris): min size
|
||||||
widget.place = Object.fromEntries(Object.entries(widget.place).map(([key, value]) => {
|
widget.place = Object.fromEntries(Object.entries(widget.place).map(([key, value]) => {
|
||||||
@@ -131,17 +137,6 @@ export default {
|
|||||||
this.widgets.forEach((widget, i) => {
|
this.widgets.forEach((widget, i) => {
|
||||||
if (failed.includes(widget.id)) {
|
if (failed.includes(widget.id)) {
|
||||||
this.widgets[i] = structuredClone(ObjectUtils.deepToRaw(this.originalWidgets[widget.id]));
|
this.widgets[i] = structuredClone(ObjectUtils.deepToRaw(this.originalWidgets[widget.id]));
|
||||||
/** NOTE(chris): if you wanna hide or unhide a
|
|
||||||
* preset and it fails: switch around the hidden
|
|
||||||
* value to revert it properly (checkboxes can't
|
|
||||||
* really handle it otherwise)
|
|
||||||
*/
|
|
||||||
if (payload[widget.id].hidden !== undefined) {
|
|
||||||
this.widgets[i].hidden = payload[widget.id].hidden;
|
|
||||||
this.$nextTick(() => {
|
|
||||||
this.widgets[i] = structuredClone(ObjectUtils.deepToRaw(this.originalWidgets[widget.id]));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else if (payload[widget.id]) {
|
} else if (payload[widget.id]) {
|
||||||
payload[widget.id].id = widget.id;
|
payload[widget.id].id = widget.id;
|
||||||
payload[widget.id].index = widget.index;
|
payload[widget.id].index = widget.index;
|
||||||
@@ -160,6 +155,31 @@ export default {
|
|||||||
})
|
})
|
||||||
.catch(this.$fhcAlert.handleSystemError);
|
.catch(this.$fhcAlert.handleSystemError);
|
||||||
},
|
},
|
||||||
|
widgetUnhide(orig, place) {
|
||||||
|
place = Object.fromEntries(Object.entries(place).map(([key, value]) => {
|
||||||
|
value.w = this.sizeLimits[orig.widget].width.min;
|
||||||
|
value.h = this.sizeLimits[orig.widget].height.min;
|
||||||
|
// NOTE(chris): unpin pinned widgets because they got a new placement
|
||||||
|
value.pinned = false;
|
||||||
|
return [key, value];
|
||||||
|
}));
|
||||||
|
// NOTE(chris): clear placement in other screensizes
|
||||||
|
Object.keys(orig.place).forEach(key => {
|
||||||
|
if (!place[key]) {
|
||||||
|
place[key] = {
|
||||||
|
x: undefined,
|
||||||
|
y: undefined,
|
||||||
|
pinned: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
let payload = {};
|
||||||
|
payload[orig.id] = {
|
||||||
|
hidden: false,
|
||||||
|
place
|
||||||
|
};
|
||||||
|
return this.widgetUpdate(payload);
|
||||||
|
},
|
||||||
async fetchViewData() {
|
async fetchViewData() {
|
||||||
let viewDataResult = await this.$api.call(ApiDashboard.getViewData());
|
let viewDataResult = await this.$api.call(ApiDashboard.getViewData());
|
||||||
const viewData = viewDataResult.data;
|
const viewData = viewDataResult.data;
|
||||||
@@ -204,15 +224,23 @@ export default {
|
|||||||
},
|
},
|
||||||
template: /* html */`
|
template: /* html */`
|
||||||
<div class="core-dashboard">
|
<div class="core-dashboard">
|
||||||
<h3>
|
<header class="d-flex justify-content-between align-items-baseline">
|
||||||
{{ userFirstName ? $p.t('global/personalGreeting', [ userFirstName ]) : '' }}
|
<h3>
|
||||||
<button
|
{{ userFirstName ? $p.t('global/personalGreeting', [ userFirstName ]) : '' }}
|
||||||
class="btn ms-2"
|
</h3>
|
||||||
aria-label="edit dashboard"
|
<div class="form-check form-check-reverse form-switch">
|
||||||
v-tooltip="{ showDelay: 1000, value: $p.t('dashboard/edit') }"
|
<label class="form-check-label" for="switchEditMode">
|
||||||
@click="editMode = !editMode"
|
{{ $p.t('dashboard/edit') }}
|
||||||
><i class="fa-solid fa-gear" aria-hidden="true"></i></button>
|
</label>
|
||||||
</h3>
|
<input
|
||||||
|
class="form-check-input"
|
||||||
|
type="checkbox"
|
||||||
|
role="switch"
|
||||||
|
id="switchEditMode"
|
||||||
|
v-model="editMode"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
<dashboard-section
|
<dashboard-section
|
||||||
name="general"
|
name="general"
|
||||||
:widgets="widgets"
|
:widgets="widgets"
|
||||||
@@ -223,6 +251,7 @@ export default {
|
|||||||
<dashboard-widget-picker
|
<dashboard-widget-picker
|
||||||
ref="widgetpicker"
|
ref="widgetpicker"
|
||||||
:widgets="widgetsSetup"
|
:widgets="widgetsSetup"
|
||||||
|
:hidden-widgets="hiddenWidgets"
|
||||||
></dashboard-widget-picker>
|
></dashboard-widget-picker>
|
||||||
</div>`
|
</div>`
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ export default {
|
|||||||
"width",
|
"width",
|
||||||
"height",
|
"height",
|
||||||
"custom",
|
"custom",
|
||||||
"hidden",
|
|
||||||
"editMode",
|
"editMode",
|
||||||
"loading", // widget got added and is waiting for backend to save in db
|
"loading", // widget got added and is waiting for backend to save in db
|
||||||
"item_data",
|
"item_data",
|
||||||
@@ -115,14 +114,6 @@ export default {
|
|||||||
},
|
},
|
||||||
ready() {
|
ready() {
|
||||||
return this.component && this.arguments !== null;
|
return this.component && this.arguments !== null;
|
||||||
},
|
|
||||||
visible: {
|
|
||||||
get() {
|
|
||||||
return !this.hidden;
|
|
||||||
},
|
|
||||||
set(value) {
|
|
||||||
this.$emit('remove', this.hidden);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
@@ -202,10 +193,8 @@ export default {
|
|||||||
},
|
},
|
||||||
template: /*html*/ `
|
template: /*html*/ `
|
||||||
<article
|
<article
|
||||||
v-if="!hidden || editMode"
|
|
||||||
class="dashboard-item card overflow-hidden h-100 position-relative"
|
class="dashboard-item card overflow-hidden h-100 position-relative"
|
||||||
:class="{
|
:class="{
|
||||||
'hidden-widget': hidden,
|
|
||||||
[arguments?.className]: arguments && arguments.className
|
[arguments?.className]: arguments && arguments.className
|
||||||
}"
|
}"
|
||||||
>
|
>
|
||||||
@@ -299,9 +288,9 @@ export default {
|
|||||||
>
|
>
|
||||||
<i class="fa-solid fa-gear" aria-hidden="true"></i>
|
<i class="fa-solid fa-gear" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
<!-- delete button -->
|
<!-- delete/hide button -->
|
||||||
<a
|
<a
|
||||||
v-if="custom && editMode"
|
v-if="editMode"
|
||||||
href="#"
|
href="#"
|
||||||
class="col-auto px-1"
|
class="col-auto px-1"
|
||||||
:aria-label="$p.t('dashboard/widget_delete')"
|
:aria-label="$p.t('dashboard/widget_delete')"
|
||||||
@@ -310,19 +299,6 @@ export default {
|
|||||||
>
|
>
|
||||||
<i class="fa-solid fa-trash" aria-hidden="true"></i>
|
<i class="fa-solid fa-trash" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
<!-- hide button -->
|
|
||||||
<Transition>
|
|
||||||
<div v-if="!custom && editMode" class="col-auto px-1 form-switch">
|
|
||||||
<input
|
|
||||||
type="checkbox"
|
|
||||||
role="switch"
|
|
||||||
v-model="visible"
|
|
||||||
class="form-check-input ms-0"
|
|
||||||
:value="true"
|
|
||||||
:aria-label="$p.t('dashboard/widget_toggle_visibility')"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
</Transition>
|
|
||||||
</header>
|
</header>
|
||||||
<!-- TODO Manu rename/remove-->
|
<!-- TODO Manu rename/remove-->
|
||||||
<div v-if="ready" class="card-body overflow-hidden p-0">
|
<div v-if="ready" class="card-body overflow-hidden p-0">
|
||||||
|
|||||||
@@ -124,8 +124,6 @@ export default {
|
|||||||
return { ...item, ...placement, weight };
|
return { ...item, ...placement, weight };
|
||||||
});
|
});
|
||||||
|
|
||||||
if (this.editModeIsActive)
|
|
||||||
return placedItems;
|
|
||||||
return placedItems.filter(item => !item.hidden);
|
return placedItems.filter(item => !item.hidden);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -141,22 +139,12 @@ export default {
|
|||||||
handleConfigClosed() {
|
handleConfigClosed() {
|
||||||
this.configOpened = false
|
this.configOpened = false
|
||||||
},
|
},
|
||||||
removeWidget(item, revert) {
|
removeWidget(item) {
|
||||||
if (item.custom) {
|
if (item.custom) {
|
||||||
BsConfirm.popup(this.$p.t('dashboard', 'alert_deleteWidget')).then(() => this.$emit('widgetRemove', item.id, this.name));
|
BsConfirm.popup(this.$p.t('dashboard', 'alert_deleteWidget')).then(() => this.$emit('widgetRemove', item.id, this.name));
|
||||||
} else {
|
} else {
|
||||||
let update = {};
|
let update = {};
|
||||||
update[item.id] = { hidden: !revert };
|
update[item.id] = { hidden: true };
|
||||||
|
|
||||||
if (!revert) {
|
|
||||||
// NOTE(chris): move to last line
|
|
||||||
update[item.id].place = [];
|
|
||||||
let y = this.gridHeight;
|
|
||||||
if (this.additionalRow)
|
|
||||||
y--;
|
|
||||||
update[item.id].place[this.gridWidth] = { x: 0, y };
|
|
||||||
}
|
|
||||||
|
|
||||||
this.updatePreset(update);
|
this.updatePreset(update);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -251,13 +239,12 @@ export default {
|
|||||||
:loading="item.loading"
|
:loading="item.loading"
|
||||||
:config="item.config"
|
:config="item.config"
|
||||||
:custom="item.custom"
|
:custom="item.custom"
|
||||||
:hidden="item.hidden"
|
|
||||||
:editMode="editModeIsActive"
|
:editMode="editModeIsActive"
|
||||||
:place="item.place[gridWidth]"
|
:place="item.place[gridWidth]"
|
||||||
:widget-template="indexedWidgetsTemplates[item.widget]"
|
:widget-template="indexedWidgetsTemplates[item.widget]"
|
||||||
:source="adminMode ? null : item.source || 'custom'"
|
:source="adminMode ? null : item.source || 'custom'"
|
||||||
@change="saveConfig($event, item)"
|
@change="saveConfig($event, item)"
|
||||||
@remove="removeWidget(item, $event)"
|
@remove="removeWidget(item)"
|
||||||
@config-opened="handleConfigOpened"
|
@config-opened="handleConfigOpened"
|
||||||
@config-closed="handleConfigClosed"
|
@config-closed="handleConfigClosed"
|
||||||
@pin-item="updatePositions"
|
@pin-item="updatePositions"
|
||||||
|
|||||||
@@ -7,11 +7,21 @@ export default {
|
|||||||
WidgetIcon,
|
WidgetIcon,
|
||||||
},
|
},
|
||||||
props: [
|
props: [
|
||||||
"widgets"
|
"widgets",
|
||||||
|
"hiddenWidgets"
|
||||||
],
|
],
|
||||||
data: () => ({
|
data: () => ({
|
||||||
callbacks: {}
|
callbacks: {}
|
||||||
}),
|
}),
|
||||||
|
computed: {
|
||||||
|
hasAnyWidgets() {
|
||||||
|
if (!this.widgets)
|
||||||
|
return false;
|
||||||
|
if (!this.widgets.length && !this.hiddenWidgets?.length)
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
getWidget() {
|
getWidget() {
|
||||||
return new Promise((resolve,reject) => {
|
return new Promise((resolve,reject) => {
|
||||||
@@ -37,23 +47,46 @@ export default {
|
|||||||
<bs-modal
|
<bs-modal
|
||||||
ref="modal"
|
ref="modal"
|
||||||
class="fade"
|
class="fade"
|
||||||
:dialog-class="{ 'modal-fullscreen-sm-down': 1, 'modal-xl': widgets && widgets.length > 0 }"
|
:dialog-class="{ 'modal-fullscreen-sm-down': 1, 'modal-xl': hasAnyWidgets }"
|
||||||
@hiddenBsModal="close"
|
@hiddenBsModal="close"
|
||||||
>
|
>
|
||||||
<template v-slot:title>{{ $p.t('dashboard/createWidget') }}</template>
|
<template v-slot:title>{{ $p.t('dashboard/createWidget') }}</template>
|
||||||
<template v-slot:default>
|
<template v-slot:default>
|
||||||
<div v-if="widgets" class="row g-2">
|
<template v-if="widgets && hiddenWidgets">
|
||||||
<div v-if="!widgets.length">
|
|
||||||
{{ $p.t('dashboard/noWidgetsAvailable') }}
|
|
||||||
</div>
|
|
||||||
<div
|
<div
|
||||||
v-for="widget in widgets"
|
v-if="!widgets.length && !hiddenWidgets.length"
|
||||||
:key="widget.widget_id"
|
class="row g-2"
|
||||||
class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2"
|
|
||||||
>
|
>
|
||||||
<widget-icon @select="pick" :widget="widget"></widget-icon>
|
<div>{{ $p.t('dashboard/noWidgetsAvailable') }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<template v-else>
|
||||||
|
<div
|
||||||
|
v-if="hiddenWidgets.length"
|
||||||
|
class="row g-2"
|
||||||
|
:class="widgets.length ? 'border-bottom pb-3 mb-3' : ''"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-for="widget in hiddenWidgets"
|
||||||
|
:key="widget.widget_id"
|
||||||
|
class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2"
|
||||||
|
>
|
||||||
|
<widget-icon @select="pick(widget)" :widget="widgets.find(w => w.widget_id == widget.widget)"></widget-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
v-if="widgets.length"
|
||||||
|
class="row g-2"
|
||||||
|
>
|
||||||
|
<div
|
||||||
|
v-for="widget in widgets"
|
||||||
|
:key="widget.widget_id"
|
||||||
|
class="widget-icon-container col-sm-6 col-md-4 col-lg-3 col-xl-2"
|
||||||
|
>
|
||||||
|
<widget-icon @select="pick" :widget="widget"></widget-icon>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</template>
|
||||||
<div v-else class="text-center">
|
<div v-else class="text-center">
|
||||||
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
<i class="fa-solid fa-spinner fa-pulse fa-3x"></i>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -400,32 +400,37 @@ export default {
|
|||||||
|
|
||||||
<div v-if="headerData.length == 1">
|
<div v-if="headerData.length == 1">
|
||||||
<div v-if="!isLoading" 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 mt-2">
|
||||||
{{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>
|
||||||
<core-tag ref="tagComponent"
|
|
||||||
v-if="tagsEnabled"
|
<div class="d-flex border rounded align-items-center ps-1">
|
||||||
:endpoint="tagEndpoint"
|
<core-tag ref="tagComponent"
|
||||||
:values="prestudentIds"
|
v-if="tagsEnabled"
|
||||||
@added="addedTag"
|
:endpoint="tagEndpoint"
|
||||||
@deleted="deletedTag"
|
:values="prestudentIds"
|
||||||
@updated="updatedTag"
|
:show-hover="true"
|
||||||
zuordnung_typ="prestudent_id"
|
@added="addedTag"
|
||||||
></core-tag>
|
@deleted="deletedTag"
|
||||||
<div
|
@updated="updatedTag"
|
||||||
role="button"
|
zuordnung_typ="prestudent_id"
|
||||||
v-if="tagsEnabled"
|
></core-tag>
|
||||||
@click="rebuildPrestudentTags"
|
<div
|
||||||
class="btn btn-outline btn-light mb-1"
|
role="button"
|
||||||
:title="'Automatische Tags fuer ' + currentSemester + ' neu laden'"
|
v-if="tagsEnabled"
|
||||||
>
|
@click="rebuildPrestudentTags"
|
||||||
<i class="fa-solid fa-refresh pe-1"></i>
|
class="btn btn-outline btn-sm btn-hover m-1"
|
||||||
<span>{{currentSemester}}</span>
|
:title="$p.t('tag','rebuild_tags') + ' ' + currentSemester"
|
||||||
|
>
|
||||||
|
<i class="fa-solid fa-refresh pe-1"></i>
|
||||||
|
<span>{{currentSemester}}</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h6 v-if="headerData[0].unruly" class="badge" :class="'bg-unruly rounded-0'"><strong>unruly</strong></h6>
|
<h6 v-if="headerData[0].unruly" class="badge" :class="'bg-unruly rounded-0'"><strong>unruly</strong></h6>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="d-flex align-items-center gap-3">
|
<div v-else class="d-flex align-items-center gap-3">
|
||||||
|
|||||||
@@ -233,6 +233,14 @@ export default {
|
|||||||
if (value == oldValue)
|
if (value == oldValue)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/** NOTE(chris): tempPositionUpdates depends on the cols not to be
|
||||||
|
* updated. So if they do we reset to get a clean value. In case the
|
||||||
|
* drag and drop operation is still motion on the next tick this
|
||||||
|
* will be correct again and if there is no such operation we clean
|
||||||
|
* up.
|
||||||
|
*/
|
||||||
|
this.tempPositionUpdates = null;
|
||||||
|
|
||||||
this.reinitGrid();
|
this.reinitGrid();
|
||||||
},
|
},
|
||||||
rows: {
|
rows: {
|
||||||
@@ -246,6 +254,11 @@ export default {
|
|||||||
},
|
},
|
||||||
indexedItems: {
|
indexedItems: {
|
||||||
handler(value) {
|
handler(value) {
|
||||||
|
/** NOTE(chris): there was an update of the items, so in case
|
||||||
|
* it came from a drag and drop operation we need to clean up
|
||||||
|
*/
|
||||||
|
this.tempPositionUpdates = null;
|
||||||
|
|
||||||
this.reinitGrid();
|
this.reinitGrid();
|
||||||
},
|
},
|
||||||
immediate: true,
|
immediate: true,
|
||||||
|
|||||||
+6
-2
@@ -553,8 +553,12 @@ export default {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!this.formData.akadgrad_id && this.arrAkadGrad.length > 0) {
|
if (!this.formData.akadgrad_id && this.arrAkadGrad.length > 0) {
|
||||||
if(this.student.geschlecht == 'w')
|
const akadGradByGeschlecht = this.arrAkadGrad.find((item) => {
|
||||||
this.formData.akadgrad_id = this.arrAkadGrad[1].akadgrad_id;
|
return item.geschlecht === this.student.geschlecht;
|
||||||
|
});
|
||||||
|
|
||||||
|
if(akadGradByGeschlecht)
|
||||||
|
this.formData.akadgrad_id = akadGradByGeschlecht.akadgrad_id;
|
||||||
else
|
else
|
||||||
this.formData.akadgrad_id = this.arrAkadGrad[0].akadgrad_id;
|
this.formData.akadgrad_id = this.arrAkadGrad[0].akadgrad_id;
|
||||||
}
|
}
|
||||||
|
|||||||
+49
-21
@@ -1,6 +1,7 @@
|
|||||||
import {CoreFilterCmpt} from "../../../../filter/Filter.js";
|
import {CoreFilterCmpt} from "../../../../filter/Filter.js";
|
||||||
import FormInput from "../../../../Form/Input.js";
|
import FormInput from "../../../../Form/Input.js";
|
||||||
import FormForm from '../../../../Form/Form.js';
|
import FormForm from '../../../../Form/Form.js';
|
||||||
|
import { capitalize } from '../../../../../helpers/StringHelpers.js';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "TblCourseList",
|
name: "TblCourseList",
|
||||||
@@ -30,7 +31,7 @@ export default {
|
|||||||
tabulatorEvents: [],
|
tabulatorEvents: [],
|
||||||
listStudiensemester: [],
|
listStudiensemester: [],
|
||||||
dataSem: {},
|
dataSem: {},
|
||||||
showStundenplanDev: false
|
stundenplanEnvironment: 'prod'
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
@@ -46,14 +47,15 @@ export default {
|
|||||||
return link;
|
return link;
|
||||||
},
|
},
|
||||||
dbStundenplanTable: function (){
|
dbStundenplanTable: function (){
|
||||||
return this.showStundenplanDev ? 'stundenplandev' : 'stundenplan';
|
return this.stundenplanEnvironment === 'dev' ? 'stundenplandev' : 'stundenplan';
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
initTabulatorOptions(){
|
initTabulatorOptions(){
|
||||||
this.tabulatorOptions = {
|
this.tabulatorOptions = {
|
||||||
ajaxURL: 'dummy',
|
ajaxURL: 'dummy',
|
||||||
ajaxRequestFunc: () => this.$api.call(this.endpoint.getCourselist(this.id, this.dataSem.start, this.dataSem.ende, this.dbStundenplanTable)),
|
//ajaxRequestFunc: () => this.$api.call(this.endpoint.getCourselist(this.id, this.dataSem.start, this.dataSem.ende, this.dbStundenplanTable)),
|
||||||
|
ajaxRequestFunc: () => this.$api.call(this.endpoint.getCourselistByStudiensemester(this.id, this.currentSemester, this.dbStundenplanTable)),
|
||||||
ajaxResponse: (url, params, response) => {
|
ajaxResponse: (url, params, response) => {
|
||||||
return response.data;
|
return response.data;
|
||||||
},
|
},
|
||||||
@@ -112,15 +114,15 @@ export default {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
setHeader('lehrveranstaltung_id', this.$p.t('lehre', 'lehrveranstaltung_id'));
|
setHeader('lehrveranstaltung_id', capitalize(this.$p.t('lehre','lehrveranstaltung_id')));
|
||||||
setHeader('lehreinheit_id', this.$p.t('global', 'lehreinheit_id'));
|
setHeader('lehreinheit_id', capitalize(this.$p.t('global','lehreinheit_id')));
|
||||||
setHeader('datum', this.$p.t('global', 'datum'));
|
setHeader('datum', capitalize(this.$p.t('global','datum')));
|
||||||
setHeader('beginn', this.$p.t('ui', 'dateFrom'));
|
setHeader('beginn', capitalize(this.$p.t('ui','dateFrom')));
|
||||||
setHeader('ende', this.$p.t('ui', 'dateTo'));
|
setHeader('ende', capitalize(this.$p.t('ui','dateTo')));
|
||||||
setHeader('gruppen_kuerzel', this.$p.t('global', 'gruppen'));
|
setHeader('gruppen_kuerzel', capitalize(this.$p.t('global','gruppen')));
|
||||||
setHeader('ort_kurzbz', this.$p.t('global', 'ortLocation'));
|
setHeader('ort_kurzbz', capitalize(this.$p.t('global','ortLocation')));
|
||||||
setHeader('lektorname', this.$p.t('lehre', 'lektor'));
|
setHeader('lektorname', capitalize(this.$p.t('lehre','lektor')));
|
||||||
setHeader('lehrfach_bez', this.$p.t('global', 'lehrfach'));
|
setHeader('lehrfach_bez', capitalize(this.$p.t('global','lehrfach')));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
@@ -135,7 +137,6 @@ export default {
|
|||||||
this.$refs.table.reloadTable();
|
this.$refs.table.reloadTable();
|
||||||
},
|
},
|
||||||
switchStundenplan(){
|
switchStundenplan(){
|
||||||
this.showStundenplanDev = !this.showStundenplanDev;
|
|
||||||
this.reload();
|
this.reload();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -172,18 +173,45 @@ export default {
|
|||||||
reload
|
reload
|
||||||
:reload-btn-infotext="this.$p.t('table', 'reload')"
|
:reload-btn-infotext="this.$p.t('table', 'reload')"
|
||||||
>
|
>
|
||||||
<template #actions>
|
<template #actions>
|
||||||
<button
|
<button
|
||||||
class="btn btn-outline-secondary"
|
class="btn btn-outline-secondary me-2"
|
||||||
@click="exportToExcel">
|
@click="exportToExcel">
|
||||||
{{$p.t('ui', 'export')}}
|
{{$p.t('ui', 'export')}}
|
||||||
</button>
|
</button>
|
||||||
<button
|
|
||||||
class="btn btn-outline-secondary"
|
<div class="btn-group" role="group">
|
||||||
@click="switchStundenplan">
|
<input
|
||||||
<span v-if="!showStundenplanDev">{{$p.t('lehre', 'stundenplan')}}</span>
|
type="radio"
|
||||||
<span v-else>{{$p.t('lehre', 'stundenplanDev')}}</span>
|
class="btn-check"
|
||||||
</button>
|
name="btnradio"
|
||||||
|
id="btnradio_prod"
|
||||||
|
value="prod"
|
||||||
|
v-model="stundenplanEnvironment"
|
||||||
|
@change="switchStundenplan()"
|
||||||
|
>
|
||||||
|
<label
|
||||||
|
class="btn btn-outline-secondary"
|
||||||
|
for="btnradio_prod"
|
||||||
|
>
|
||||||
|
{{$p.t('lehre', 'btn_stundenplanProd')}}
|
||||||
|
</label>
|
||||||
|
<input
|
||||||
|
type="radio"
|
||||||
|
class="btn-check"
|
||||||
|
name="btnradio"
|
||||||
|
id="btnradio_dev"
|
||||||
|
value="dev"
|
||||||
|
v-model="stundenplanEnvironment"
|
||||||
|
@change="switchStundenplan()"
|
||||||
|
>
|
||||||
|
<label
|
||||||
|
class="btn btn-outline-secondary"
|
||||||
|
for="btnradio_dev"
|
||||||
|
>
|
||||||
|
{{$p.t('lehre', 'btn_stundenplanDev')}}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</core-filter-cmpt>
|
</core-filter-cmpt>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -317,6 +317,7 @@ export default {
|
|||||||
"$p.user_language.value"(n, o) {
|
"$p.user_language.value"(n, o) {
|
||||||
if (n !== o && o !== undefined && this.$refs.table.tableBuilt) {
|
if (n !== o && o !== undefined && this.$refs.table.tableBuilt) {
|
||||||
this.translateTabulator();
|
this.translateTabulator();
|
||||||
|
this.$reloadList();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"tagFilterState.selectedOptions": {
|
"tagFilterState.selectedOptions": {
|
||||||
@@ -842,35 +843,39 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #actions>
|
<template #tags>
|
||||||
<core-tag ref="tagComponent"
|
<div class="d-flex border rounded align-items-center ps-1">
|
||||||
v-if="tagsEnabled"
|
<core-tag ref="tagComponent"
|
||||||
:endpoint="tagEndpoint"
|
v-if="tagsEnabled"
|
||||||
:values="selectedColumnValues"
|
:endpoint="tagEndpoint"
|
||||||
@added="addedTag"
|
:values="selectedColumnValues"
|
||||||
@deleted="deletedTag"
|
@added="addedTag"
|
||||||
@updated="updatedTag"
|
@deleted="deletedTag"
|
||||||
zuordnung_typ="prestudent_id"
|
@updated="updatedTag"
|
||||||
></core-tag>
|
zuordnung_typ="prestudent_id"
|
||||||
|
show-hover
|
||||||
|
></core-tag>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
v-if="!selected.length"
|
v-if="!selected.length"
|
||||||
class="btn btn-outline btn-light mb-1"
|
class="btn btn-outline btn-sm m-1 btn-hover"
|
||||||
@click="rebuild(selected)"
|
@click="rebuild(selected)"
|
||||||
:title="$p.t('tag','rebuild_tags') + ' Stg ' + currentSemester"
|
:title="$p.t('tag','rebuild_tags') + ' Stg ' + currentSemester"
|
||||||
>
|
>
|
||||||
<i class="fa-solid fa-refresh pe-1"></i> STG
|
<i class="fa-solid fa-refresh pe-1"></i> STG
|
||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
v-else
|
v-else
|
||||||
class="btn btn-outline btn-light mb-1"
|
class="btn btn-outline btn-sm m-1 btn-hover"
|
||||||
@click="rebuild(selected)"
|
@click="rebuild(selected)"
|
||||||
:title="$p.t('tag','rebuild_tags') + ' ' + $p.t('ui','selection') + ' ' + currentSemester"
|
:title="$p.t('tag','rebuild_tags') + ' ' + $p.t('ui','selection') + ' ' + currentSemester"
|
||||||
>
|
>
|
||||||
<i class="fa-solid fa-refresh pe-1"></i> {{selected.length}}
|
<i class="fa-solid fa-refresh pe-1"></i> {{selected.length}}
|
||||||
</button>
|
</button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
<template 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>
|
||||||
@@ -884,8 +889,6 @@ export default {
|
|||||||
<span class="fa-solid fa-filter-circle-xmark"></span>
|
<span class="fa-solid fa-filter-circle-xmark"></span>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
|
||||||
|
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<template #filter>
|
<template #filter>
|
||||||
@@ -895,6 +898,7 @@ export default {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
</core-filter-cmpt>
|
</core-filter-cmpt>
|
||||||
</div>
|
</div>
|
||||||
<list-new ref="new" :studiengang-kz="studiengangKz" :studiensemester-kurzbz="studiensemesterKurzbz"></list-new>
|
<list-new ref="new" :studiengang-kz="studiengangKz" :studiensemester-kurzbz="studiensemesterKurzbz"></list-new>
|
||||||
|
|||||||
@@ -28,6 +28,10 @@ export default {
|
|||||||
confirmLimit: {
|
confirmLimit: {
|
||||||
type: Number,
|
type: Number,
|
||||||
default: 20
|
default: 20
|
||||||
|
},
|
||||||
|
showHover: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
data() {
|
data() {
|
||||||
@@ -228,7 +232,8 @@ export default {
|
|||||||
<span :title="values.length === 0 ? 'Bitte Zeilen markieren' : ''">
|
<span :title="values.length === 0 ? 'Bitte Zeilen markieren' : ''">
|
||||||
<button @mouseover="showList = true"
|
<button @mouseover="showList = true"
|
||||||
:disabled="!values || values.length === 0"
|
:disabled="!values || values.length === 0"
|
||||||
class="btn btn-sm">
|
class="btn btn-sm"
|
||||||
|
:class="{'btn-hover': showHover}">
|
||||||
<i class="fa-solid fa-tag fa-xl"></i>
|
<i class="fa-solid fa-tag fa-xl"></i>
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
|
|||||||
@@ -1094,7 +1094,7 @@ export const CoreFilterCmpt = {
|
|||||||
<div :id="'filterCollapsables' + idExtra">
|
<div :id="'filterCollapsables' + idExtra">
|
||||||
|
|
||||||
<div class="d-flex flex-row justify-content-between flex-wrap">
|
<div class="d-flex flex-row justify-content-between flex-wrap">
|
||||||
<div v-if="newBtnShow || reload || $slots.search || $slots.actions" class="d-flex gap-2 align-items-baseline flex-wrap">
|
<div v-if="newBtnShow || reload || $slots.search || $slots.actions || $slots.tags" class="d-flex gap-2 align-items-baseline flex-wrap">
|
||||||
<button v-if="newBtnShow" class="btn btn-primary" :class="newBtnClass" :title="newBtnLabel ? undefined : 'New'" :aria-label="newBtnLabel ? undefined : 'New'" @click="$emit('click:new', $event)" :disabled="newBtnDisabled">
|
<button v-if="newBtnShow" class="btn btn-primary" :class="newBtnClass" :title="newBtnLabel ? undefined : 'New'" :aria-label="newBtnLabel ? undefined : 'New'" @click="$emit('click:new', $event)" :disabled="newBtnDisabled">
|
||||||
<span class="fa-solid fa-plus" aria-hidden="true"></span>
|
<span class="fa-solid fa-plus" aria-hidden="true"></span>
|
||||||
{{ newBtnLabel }}
|
{{ newBtnLabel }}
|
||||||
@@ -1107,6 +1107,7 @@ export const CoreFilterCmpt = {
|
|||||||
<span v-else id="selected-info-text"> Mit {{ selectedData.length }} ausgewählten:</span>
|
<span v-else id="selected-info-text"> Mit {{ selectedData.length }} ausgewählten:</span>
|
||||||
</span>
|
</span>
|
||||||
<slot name="actions" v-bind="{selected: tabulatorHasSelector ? selectedData : []}"></slot>
|
<slot name="actions" v-bind="{selected: tabulatorHasSelector ? selectedData : []}"></slot>
|
||||||
|
<slot name="tags"></slot>
|
||||||
<slot name="search"></slot>
|
<slot name="search"></slot>
|
||||||
</div>
|
</div>
|
||||||
<div class="d-flex gap-1 align-items-baseline flex-grow-1 justify-content-end">
|
<div class="d-flex gap-1 align-items-baseline flex-grow-1 justify-content-end">
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ export default {
|
|||||||
query: Vue.computed(() => this.lastQuery),
|
query: Vue.computed(() => this.lastQuery),
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
inject: ["isMobile"],
|
inject: { isMobile: { default: false } },
|
||||||
data: function () {
|
data: function () {
|
||||||
return {
|
return {
|
||||||
searchtimer: null,
|
searchtimer: null,
|
||||||
|
|||||||
@@ -100,6 +100,7 @@ require_once('dbupdate_3.4/68530_Dashboard_Cleanup.php');
|
|||||||
require_once('dbupdate_3.4/75959_StudVw_Automatische_Tags.php');
|
require_once('dbupdate_3.4/75959_StudVw_Automatische_Tags.php');
|
||||||
require_once('dbupdate_3.4/76160_lvv_favorites.php');
|
require_once('dbupdate_3.4/76160_lvv_favorites.php');
|
||||||
require_once('dbupdate_3.4/77080_tabulator_presets_table.php');
|
require_once('dbupdate_3.4/77080_tabulator_presets_table.php');
|
||||||
|
require_once('dbupdate_3.4/78292_gehaltsanpassungtyp.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,47 @@
|
|||||||
|
<?php
|
||||||
|
if (! defined('DB_NAME')) exit('No direct script access allowed');
|
||||||
|
|
||||||
|
if ($result = $db->db_query("SELECT * FROM information_schema.tables WHERE table_name='tbl_gehaltsanpassungtyp' AND table_schema='hr'"))
|
||||||
|
{
|
||||||
|
if ($db->db_num_rows($result) == 0)
|
||||||
|
{
|
||||||
|
$qry = "
|
||||||
|
|
||||||
|
ALTER TABLE
|
||||||
|
hr.tbl_gehaltsbestandteil
|
||||||
|
ADD COLUMN IF NOT EXISTS
|
||||||
|
gehaltsanpassungtyp_kurzbz character varying(32);
|
||||||
|
|
||||||
|
COMMENT ON COLUMN hr.tbl_gehaltsbestandteil.gehaltsanpassungtyp_kurzbz IS E'Ersteinstufung, indiv. Erhöhung, etc.';
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS hr.tbl_gehaltsanpassungtyp
|
||||||
|
(
|
||||||
|
gehaltsanpassungtyp_kurzbz character varying(32) NOT NULL,
|
||||||
|
bezeichnung varchar(256),
|
||||||
|
sort smallint,
|
||||||
|
aktiv boolean NOT NULL DEFAULT true,
|
||||||
|
CONSTRAINT tbl_gehaltsanpassungtyp_pk PRIMARY KEY (gehaltsanpassungtyp_kurzbz)
|
||||||
|
);
|
||||||
|
|
||||||
|
COMMENT ON TABLE hr.tbl_gehaltsanpassungtyp IS E'Key-Table of Salary Adaption Types';
|
||||||
|
|
||||||
|
ALTER TABLE hr.tbl_gehaltsbestandteil DROP CONSTRAINT IF EXISTS tbl_gehaltsanpassungtyp_fk;
|
||||||
|
ALTER TABLE hr.tbl_gehaltsbestandteil ADD CONSTRAINT tbl_gehaltsanpassungtyp_fk FOREIGN KEY (gehaltsanpassungtyp_kurzbz)
|
||||||
|
REFERENCES hr.tbl_gehaltsanpassungtyp (gehaltsanpassungtyp_kurzbz) MATCH FULL
|
||||||
|
ON DELETE RESTRICT ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
GRANT SELECT, UPDATE, INSERT, DELETE ON hr.tbl_gehaltsanpassungtyp TO vilesci;
|
||||||
|
|
||||||
|
INSERT INTO hr.tbl_gehaltsanpassungtyp(gehaltsanpassungtyp_kurzbz, bezeichnung, sort, aktiv) VALUES('ersteinstufung','Ersteinstufung', 1, true);
|
||||||
|
INSERT INTO hr.tbl_gehaltsanpassungtyp(gehaltsanpassungtyp_kurzbz, bezeichnung, sort, aktiv) VALUES('individuelle_erhoehung','Indiv. Gehaltserhöhung', 2, true);
|
||||||
|
INSERT INTO hr.tbl_gehaltsanpassungtyp(gehaltsanpassungtyp_kurzbz, bezeichnung, sort, aktiv) VALUES('strukturelle_anpassung','Strukturelle Anpassung', 3, true);
|
||||||
|
INSERT INTO hr.tbl_gehaltsanpassungtyp(gehaltsanpassungtyp_kurzbz, bezeichnung, sort, aktiv) VALUES('funktionsaenderung','Funktionsänderung', 4, true);
|
||||||
|
|
||||||
|
";
|
||||||
|
|
||||||
|
if (! $db->db_query($qry))
|
||||||
|
echo '<strong>Gehaltsanpassungtyp: ' . $db->db_last_error() . '</strong><br>';
|
||||||
|
else
|
||||||
|
echo 'Tabelle und Feld für Gehaltsanpassungtyp wurden neu erstellt<br>';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -29742,6 +29742,46 @@ array(
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'profil',
|
||||||
|
'phrase' => 'name_title_clipboard_copy_confirmation',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Name mit Titel in die Zwischenablage kopiert.',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'Full name with title copied to clipboard.',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'profil',
|
||||||
|
'phrase' => 'name_title_copy',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Name mit Titel kopieren',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'Copy full name with title',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
array(
|
array(
|
||||||
'app' => 'core',
|
'app' => 'core',
|
||||||
'category' => 'profil',
|
'category' => 'profil',
|
||||||
@@ -60852,6 +60892,26 @@ I have been informed that I am under no obligation to consent to the transmissio
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'LvPlan',
|
||||||
|
'phrase' => 'copy',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'Kopieren',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'Copy',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
// ### LvPlanStgOrg END ###
|
// ### LvPlanStgOrg END ###
|
||||||
// DMS-Link Phrasen Start
|
// DMS-Link Phrasen Start
|
||||||
array(
|
array(
|
||||||
@@ -62351,6 +62411,46 @@ I have been informed that I am under no obligation to consent to the transmissio
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'lehre',
|
||||||
|
'phrase' => 'btn_stundenplanDev',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'LV-Plan (Planungs-Daten)',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'LV-Plan (developing data)',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'app' => 'core',
|
||||||
|
'category' => 'lehre',
|
||||||
|
'phrase' => 'btn_stundenplanProd',
|
||||||
|
'insertvon' => 'system',
|
||||||
|
'phrases' => array(
|
||||||
|
array(
|
||||||
|
'sprache' => 'German',
|
||||||
|
'text' => 'LV-Plan (Produktiv Daten)',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'sprache' => 'English',
|
||||||
|
'text' => 'LV-Plan (produktive data',
|
||||||
|
'description' => '',
|
||||||
|
'insertvon' => 'system'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user