Compare commits

...
Author SHA1 Message Date
Harald Bamberger 47716f1aff use new endpoint in frontend, skip next semester spezialgruppen 2026-10-09 16:51:17 +02:00
Harald Bamberger 682ad7c0e8 further progress 2026-10-09 16:07:28 +02:00
Harald Bamberger 8b68e60ae8 work in progress 2026-10-09 15:14:51 +02:00
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
6 changed files with 632 additions and 291 deletions
@@ -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);
} }
} }
+20 -3
View File
@@ -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]);
} }
} }
+9
View File
@@ -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);
@@ -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>
+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'
)
)
),
); );