mirror of
https://github.com/FH-Complete/FHC-Core.git
synced 2026-10-12 06:54:04 +00:00
Compare commits
8
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bdf8b3c609 | ||
|
|
f616d70a5d | ||
|
|
e70449046e | ||
|
|
53e64cc83f | ||
|
|
4f8ffa1228 | ||
|
|
a826bd7bc7 | ||
|
|
6324c3d467 | ||
|
|
377c53cf60 |
@@ -36,33 +36,68 @@ class LvTermine extends FHCAPI_Controller
|
||||
//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)
|
||||
{
|
||||
$ci = get_instance();
|
||||
$student_uid = $uid;
|
||||
$semester_range = $this->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->applyLoadUeberSemesterHaelfte($semester_range);
|
||||
$function_error = $this->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);
|
||||
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($semester_range, $student_uid);
|
||||
$benutzer_gruppen = $this->fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range);
|
||||
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)
|
||||
$stundenplan_query = $this->StundenplanModel->getStundenplanQuery(
|
||||
$start_date,
|
||||
$end_date,
|
||||
$semester_range,
|
||||
$benutzer_gruppen,
|
||||
$student_lehrverband
|
||||
);
|
||||
else
|
||||
$stundenplan_query = $this->StundenplanModel->getStundenplanQuery(
|
||||
$start_date,
|
||||
$end_date,
|
||||
$semester_range,
|
||||
$benutzer_gruppen,
|
||||
$student_lehrverband,
|
||||
true,
|
||||
$dbStundenplanTable
|
||||
);
|
||||
$ende_semProlonged = $semester_range[$first_semester][$first_semester]->ende;
|
||||
$ci->addMeta(' E N D E _semProlonged', $ende_semProlonged);
|
||||
|
||||
$student_lehrverband = $this->fetchStudentlehrverbandFromStudiensemester($student_uid, $semester_range);
|
||||
|
||||
//get semester
|
||||
if (isError($student_lehrverband))
|
||||
return $student_lehrverband;
|
||||
$student_lehrverband = getData($student_lehrverband);
|
||||
$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;
|
||||
}
|
||||
|
||||
$ci->addMeta('semester of studentUid', $semesterStud);
|
||||
|
||||
$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,
|
||||
$ende_semProlonged,
|
||||
$semesterStud
|
||||
);
|
||||
|
||||
if(!$stundenplan_query)
|
||||
{
|
||||
@@ -84,47 +119,23 @@ class LvTermine extends FHCAPI_Controller
|
||||
|
||||
public function getStudiensemester()
|
||||
{
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
$this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC');
|
||||
$result = $this->StudiensemesterModel->load();
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->terminateWithSuccess($data);
|
||||
$this->StudiensemesterModel->addOrder('studienjahr_kurzbz', 'DESC');
|
||||
$result = $this->StudiensemesterModel->load();
|
||||
$data = $this->getDataOrTerminateWithError($result);
|
||||
$this->terminateWithSuccess($data);
|
||||
}
|
||||
|
||||
//copied from Stundenplan.php
|
||||
private function studienSemesterErmitteln($start_date, $end_date)
|
||||
{
|
||||
// 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)
|
||||
);
|
||||
// TODO(Manu) following 5 private functions are copybased of StundenplanLib,
|
||||
// just applyLoadUeberSemesterHaelfte is different
|
||||
// after approval: change to public in StundenplanLib and use it here?
|
||||
|
||||
// if no studiensemester is found for the given timespan, get the nearest studiensemester
|
||||
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)
|
||||
{
|
||||
private function sortStudienSemester(&$semester_range){
|
||||
usort(
|
||||
$semester_range,
|
||||
function ($first, $second) {
|
||||
function($first, $second)
|
||||
{
|
||||
$sem_first = null;
|
||||
$year_first = null;
|
||||
$match_first = null;
|
||||
@@ -133,8 +144,8 @@ class LvTermine extends FHCAPI_Controller
|
||||
$year_second = null;
|
||||
$match_second = null;
|
||||
|
||||
preg_match('/([WS]+)([0-9]+)/', $first, $match_first);
|
||||
preg_match('/([WS]+)([0-9]+)/', $second, $match_second);
|
||||
preg_match('/([WS]+)([0-9]+)/',$first,$match_first);
|
||||
preg_match('/([WS]+)([0-9]+)/',$second,$match_second);
|
||||
|
||||
$sem_first = $match_first[1];
|
||||
$year_first = intval($match_first[2]);
|
||||
@@ -146,15 +157,15 @@ class LvTermine extends FHCAPI_Controller
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
elseif($year_first > $year_second)
|
||||
else if($year_first > $year_second)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
elseif($year_first == $year_second && $sem_first > $sem_second)
|
||||
else if($year_first == $year_second && $sem_first > $sem_second)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
elseif($year_first == $year_second && $sem_first < $sem_second)
|
||||
else if($year_first == $year_second && $sem_first < $sem_second)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
@@ -163,9 +174,145 @@ class LvTermine extends FHCAPI_Controller
|
||||
);
|
||||
}
|
||||
|
||||
//copied from Stundenplan.php
|
||||
private function fetchBenutzerGruppenFromStudiensemester($student_uid, $semester_range)
|
||||
{
|
||||
$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)
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
$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 * FROM tbl_studentlehrverband where student_uid = ? AND 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)
|
||||
{
|
||||
$result = new stdClass();
|
||||
$result->studiengang_kz = $item->studiengang_kz;
|
||||
$result->semester = $item->semester;
|
||||
$result->verband = $item->verband;
|
||||
$result->gruppe = $item->gruppe;
|
||||
$result->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)
|
||||
{
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
/*
|
||||
@var($semester_collection)
|
||||
convert the array of studiensemester into an associative array with the studiensemester as the key
|
||||
@@ -185,9 +332,13 @@ class LvTermine extends FHCAPI_Controller
|
||||
foreach($semester_range as $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) {
|
||||
$this->terminateWithError("No previous semester");
|
||||
return error('no previous semester');
|
||||
}
|
||||
$previous_studiensemester = current($previous_studiensemester)->studiensemester_kurzbz;
|
||||
$semester_collection[$studiensemester] = [$previous_studiensemester, $studiensemester];
|
||||
@@ -237,25 +388,33 @@ class LvTermine extends FHCAPI_Controller
|
||||
foreach($semester_collection as $semester_original => $semester_adjoint)
|
||||
{
|
||||
$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
|
||||
$studienSemesterDateRanges[$semester_original] = [];
|
||||
|
||||
// check if the studiensemester is a summer semester and add 1 month to bridge the school summer break
|
||||
$match = null;
|
||||
preg_match("/^(SS)([0-9]+)/", $semester_original, $match);
|
||||
preg_match("/^(SS)([0-9]+)/",$semester_original,$match);
|
||||
if(count($match) >0)
|
||||
{
|
||||
$one_month = new DateInterval('P1M');
|
||||
$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->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)
|
||||
{
|
||||
$studienSemesterDateRanges[$semester_original][$adjoint]=$semester_start_ende;
|
||||
@@ -263,139 +422,106 @@ class LvTermine extends FHCAPI_Controller
|
||||
}
|
||||
else
|
||||
{
|
||||
$this->addMeta('LVPLAN_LOAD_UEBER_SEMESTERHAELFTE_FALSE', $semester_range);
|
||||
//TODO: half of a DateInterval might not be correctly calculated
|
||||
// calculate the half of the studiensemester
|
||||
$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_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');
|
||||
$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->start = $semester_start_ende->start;
|
||||
$first_half->ende = $studiensemester_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;
|
||||
}
|
||||
}
|
||||
|
||||
//copied from Stundenplan.php, extended with $student_uid
|
||||
private function fetchBenutzerGruppenFromStudiensemester($semester_range, $student_uid)
|
||||
private function studienSemesterErmitteln($start_date, $end_date)
|
||||
{
|
||||
//$student_uid = getAuthUID();
|
||||
$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
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
$this->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
|
||||
|
||||
// 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;
|
||||
// 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);
|
||||
if (isError($semester_range))
|
||||
return $semester_range;
|
||||
|
||||
$semester_range = array_map(
|
||||
function ($sem) {
|
||||
return $sem->studiensemester_kurzbz;
|
||||
},
|
||||
$benutzer_gruppen
|
||||
getData($semester_range) ?: []
|
||||
);
|
||||
|
||||
return $benutzer_gruppen;
|
||||
}
|
||||
|
||||
//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)
|
||||
// if no studiensemester is found for the given timespan, get the nearest studiensemester
|
||||
if (count($semester_range) == 0)
|
||||
{
|
||||
$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 * FROM tbl_studentlehrverband where student_uid = ? AND studiensemester_kurzbz = ?", [$student_uid, $semester]);
|
||||
$lehrverband_query_result = $this->getDataOrTerminateWithError($lehrverband_query);
|
||||
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 = $this->StudiensemesterModel->getNearest();
|
||||
if (isError($aktuelle_studiensemester))
|
||||
return $aktuelle_studiensemester;
|
||||
|
||||
$aktuelle_studiensemester = getData($aktuelle_studiensemester);
|
||||
if (count($aktuelle_studiensemester) == 0) {
|
||||
return error("No aktuelles semester");
|
||||
}
|
||||
$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
|
||||
/*
|
||||
[
|
||||
['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
|
||||
);
|
||||
//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)
|
||||
{
|
||||
$nextStudiensemester = $this->StudiensemesterModel->getNextFrom($semester_range[0]);
|
||||
if (isError($nextStudiensemester))
|
||||
return $nextStudiensemester;
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,7 +280,7 @@ class Stundenplan_model extends DB_Model
|
||||
|
||||
/**
|
||||
* queries Stundenplan but for a whole lva, irrespective of who is requesting it
|
||||
*
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function getStundenplanLVA($start_date, $end_date, $lv_id) {
|
||||
@@ -528,7 +528,7 @@ class Stundenplan_model extends DB_Model
|
||||
|
||||
return $this->execReadOnlyQuery($qry, $qry_params);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* NO STANDALONE FUNCTION - Generates a SQL query string to fetch 'stundenplan' events for a specific student within the current semester.
|
||||
*
|
||||
@@ -537,7 +537,13 @@ class Stundenplan_model extends DB_Model
|
||||
*
|
||||
* @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)
|
||||
{
|
||||
//only use longer intervall with given semesterfilter
|
||||
if($endDateNextSemHalf != null && $semesterFilter != null)
|
||||
{
|
||||
$end_date = $endDateNextSemHalf;
|
||||
}
|
||||
|
||||
// helper function to check if either $gruppen or $studentlehrverbaende are empty for each semester
|
||||
$emptyCheck = function($toBeCheckedArray) use ($semester){
|
||||
@@ -552,24 +558,30 @@ class Stundenplan_model extends DB_Model
|
||||
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))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
$query =
|
||||
"select sp.*
|
||||
"select sp.*
|
||||
from lehre.vw_".$db_stpl_table." sp
|
||||
WHERE
|
||||
sp.datum >= ".$this->escape($start_date)."
|
||||
AND sp.datum <= ".$this->escape($end_date);
|
||||
|
||||
|
||||
//necessary for new prolonged interval
|
||||
if($semesterFilter && $endDateNextSemHalf)
|
||||
{
|
||||
$query .= " AND sp.semester = " . $semesterFilter;
|
||||
}
|
||||
|
||||
// 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)
|
||||
{
|
||||
@@ -583,10 +595,10 @@ class Stundenplan_model extends DB_Model
|
||||
}
|
||||
// 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))
|
||||
@@ -594,12 +606,6 @@ class Stundenplan_model extends DB_Model
|
||||
$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)
|
||||
@@ -608,12 +614,14 @@ class Stundenplan_model extends DB_Model
|
||||
{
|
||||
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).")";
|
||||
@@ -623,9 +631,24 @@ class Stundenplan_model extends DB_Model
|
||||
$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";
|
||||
// Eintraege vom Stundenplan //not in master
|
||||
if($showLvsStundenplan)
|
||||
{
|
||||
$query .= "
|
||||
OR EXISTS (
|
||||
SELECT 1
|
||||
FROM lehre.tbl_stundenplan tsp
|
||||
WHERE tsp.lehreinheit_id = sp.lehreinheit_id
|
||||
AND tsp.studiengang_kz = " . $this->escape($lehrverband->studiengang_kz) . "
|
||||
AND (tsp.semester = " . $this->escape($lehrverband->semester) . " OR tsp.semester IS NULL)
|
||||
AND (tsp.verband = " . $this->escape($lehrverband->verband) . " OR tsp.verband IS NULL OR tsp.verband = '0' OR tsp.verband = '')
|
||||
AND (tsp.gruppe = " . $this->escape($lehrverband->gruppe) . " OR tsp.gruppe IS NULL OR tsp.gruppe = '0' OR tsp.gruppe = '')
|
||||
AND tsp.gruppe_kurzbz IS NULL)";
|
||||
}
|
||||
|
||||
$query .= "OR";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if the studentlehrverbaende is not empty we can remove the last OR that was added to the query
|
||||
@@ -638,7 +661,7 @@ class Stundenplan_model extends DB_Model
|
||||
if(!$emptyCheck($gruppen) || !$emptyCheck($studentlehrverbaende))
|
||||
{
|
||||
$query .= ")";
|
||||
}
|
||||
}
|
||||
|
||||
return $query;
|
||||
}
|
||||
@@ -730,4 +753,4 @@ class Stundenplan_model extends DB_Model
|
||||
|
||||
return $this->execQuery($qry, [$lehrveranstaltung_id, $studiensemester_kurzbz]);
|
||||
}
|
||||
}
|
||||
}
|
||||
+47
-20
@@ -1,6 +1,7 @@
|
||||
import {CoreFilterCmpt} from "../../../../filter/Filter.js";
|
||||
import FormInput from "../../../../Form/Input.js";
|
||||
import FormForm from '../../../../Form/Form.js';
|
||||
import { capitalize } from '../../../../../helpers/StringHelpers.js';
|
||||
|
||||
export default {
|
||||
name: "TblCourseList",
|
||||
@@ -30,7 +31,7 @@ export default {
|
||||
tabulatorEvents: [],
|
||||
listStudiensemester: [],
|
||||
dataSem: {},
|
||||
showStundenplanDev: false
|
||||
stundenplanEnvironment: 'prod'
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
@@ -46,7 +47,7 @@ export default {
|
||||
return link;
|
||||
},
|
||||
dbStundenplanTable: function (){
|
||||
return this.showStundenplanDev ? 'stundenplandev' : 'stundenplan';
|
||||
return this.stundenplanEnvironment === 'dev' ? 'stundenplandev' : 'stundenplan';
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
@@ -112,15 +113,15 @@ export default {
|
||||
}
|
||||
};
|
||||
|
||||
setHeader('lehrveranstaltung_id', this.$p.t('lehre', 'lehrveranstaltung_id'));
|
||||
setHeader('lehreinheit_id', this.$p.t('global', 'lehreinheit_id'));
|
||||
setHeader('datum', this.$p.t('global', 'datum'));
|
||||
setHeader('beginn', this.$p.t('ui', 'dateFrom'));
|
||||
setHeader('ende', this.$p.t('ui', 'dateTo'));
|
||||
setHeader('gruppen_kuerzel', this.$p.t('global', 'gruppen'));
|
||||
setHeader('ort_kurzbz', this.$p.t('global', 'ortLocation'));
|
||||
setHeader('lektorname', this.$p.t('lehre', 'lektor'));
|
||||
setHeader('lehrfach_bez', this.$p.t('global', 'lehrfach'));
|
||||
setHeader('lehrveranstaltung_id', capitalize(this.$p.t('lehre','lehrveranstaltung_id')));
|
||||
setHeader('lehreinheit_id', capitalize(this.$p.t('global','lehreinheit_id')));
|
||||
setHeader('datum', capitalize(this.$p.t('global','datum')));
|
||||
setHeader('beginn', capitalize(this.$p.t('ui','dateFrom')));
|
||||
setHeader('ende', capitalize(this.$p.t('ui','dateTo')));
|
||||
setHeader('gruppen_kuerzel', capitalize(this.$p.t('global','gruppen')));
|
||||
setHeader('ort_kurzbz', capitalize(this.$p.t('global','ortLocation')));
|
||||
setHeader('lektorname', capitalize(this.$p.t('lehre','lektor')));
|
||||
setHeader('lehrfach_bez', capitalize(this.$p.t('global','lehrfach')));
|
||||
}
|
||||
}
|
||||
];
|
||||
@@ -135,7 +136,6 @@ export default {
|
||||
this.$refs.table.reloadTable();
|
||||
},
|
||||
switchStundenplan(){
|
||||
this.showStundenplanDev = !this.showStundenplanDev;
|
||||
this.reload();
|
||||
}
|
||||
},
|
||||
@@ -172,18 +172,45 @@ export default {
|
||||
reload
|
||||
:reload-btn-infotext="this.$p.t('table', 'reload')"
|
||||
>
|
||||
<template #actions>
|
||||
<template #actions>
|
||||
<button
|
||||
class="btn btn-outline-secondary"
|
||||
class="btn btn-outline-secondary me-2"
|
||||
@click="exportToExcel">
|
||||
{{$p.t('ui', 'export')}}
|
||||
</button>
|
||||
<button
|
||||
class="btn btn-outline-secondary"
|
||||
@click="switchStundenplan">
|
||||
<span v-if="!showStundenplanDev">{{$p.t('lehre', 'stundenplan')}}</span>
|
||||
<span v-else>{{$p.t('lehre', 'stundenplanDev')}}</span>
|
||||
</button>
|
||||
|
||||
<div class="btn-group" role="group">
|
||||
<input
|
||||
type="radio"
|
||||
class="btn-check"
|
||||
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>
|
||||
</core-filter-cmpt>
|
||||
</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