Compare commits

...
Author SHA1 Message Date
Manuela Thamer bdf8b3c609 add comments, use array_filter of studentlehrverband 2026-09-09 11:58:03 +02:00
Manuela Thamer f616d70a5d extend logic for approximating FAS result of getting list LvTermine
- extend timeInterval for followup semester
- refactor function applyLoadUeberSemesterHaelfte
- use ausbildungssemester of student for semesterFilter in function getStundenplanQuery
- use old logic of studentlehrverbaende to avoid error for arrayfilter studentlehrverbaende
2026-09-08 16:11:45 +02:00
Manuela Thamer e70449046e Merge branch 'master' into bug-78491/StudVw_Lvv_LvTermine 2026-08-31 14:58:32 +02:00
Manuela Thamer 53e64cc83f capitalize table headers 2026-08-27 17:18:05 +02:00
Manuela Thamer 4f8ffa1228 button group for lvplan dev and prod 2026-08-27 15:46:25 +02:00
Manuela Thamer a826bd7bc7 merge master in bug-78491/StudVw_Lvv_LvTermine 2026-08-20 17:05:07 +02:00
ma0068 6324c3d467 add subquery for showing lvs of stundenplan in dependance of new parameter, deleting unused part of old parameter 2026-03-16 09:08:52 +01:00
ma0068 377c53cf60 add sql part 2026-03-12 14:12:53 +01:00
4 changed files with 432 additions and 216 deletions
@@ -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]);
}
}
}
@@ -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>
+40
View File
@@ -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'
)
)
),
);