mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-12 15:04:04 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47716f1aff | ||
|
|
682ad7c0e8 | ||
|
|
8b68e60ae8 | ||
|
|
bdf8b3c609 | ||
|
|
f616d70a5d | ||
|
|
e70449046e | ||
|
|
53e64cc83f | ||
|
|
4f8ffa1228 | ||
|
|
a826bd7bc7 | ||
|
|
6324c3d467 | ||
|
|
377c53cf60 |
@@ -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,7 +88,22 @@ 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))
|
||||||
@@ -668,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');
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -797,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
|
||||||
|
|||||||
@@ -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,93 +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,$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)
|
|
||||||
{
|
|
||||||
$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;
|
||||||
}
|
}
|
||||||
@@ -730,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]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
|||||||
+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>
|
||||||
|
|||||||
@@ -62411,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