Merge branch 'bug-78215/LVPlanEintraege_in_Sommerluecke_werden_nicht_immer_angezeigt'

This commit is contained in:
Harald Bamberger
2026-07-31 11:05:54 +02:00
2 changed files with 80 additions and 1 deletions
+4 -1
View File
@@ -80,10 +80,12 @@ class StundenplanLib
if (isError($semester_range))
return $semester_range;
$semester_range = getData($semester_range);
$this->_ci->addMeta('semester_range', $semester_range);
$this->sortStudienSemester($semester_range);
$function_error = $this->applyLoadUeberSemesterHaelfte($semester_range);
$this->_ci->addMeta('nach_apply_semester_range', $semester_range);
if ($function_error)
return $function_error;
@@ -784,7 +786,8 @@ class StundenplanLib
$this->_ci->load->model('organisation/Studiensemester_model', 'StudiensemesterModel');
// gets all studiensemester from the student from start_date to end_date
$semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date);
//$semester_range = $this->_ci->StudiensemesterModel->getByDateRange($start_date, $end_date);
$semester_range = $this->_ci->StudiensemesterModel->getContainingOrNearestByDateRange($start_date, $end_date);
if (isError($semester_range))
return $semester_range;
@@ -229,6 +229,82 @@ class Studiensemester_model extends DB_Model
return $this->execQuery($query, array($date,$date,$date,$date));
}
/**
* Gets all Studiensemester where the range dates are contained
* or the nearest if date is not contained
* @param $from
* @param $to
* @return array|null
*/
public function getContainingOrNearestByDateRange($from, $to)
{
if (date_format(date_create($from), 'Y-m-d') > (date_format(date_create($to), 'Y-m-d')))
return success(array());
$query = <<<EOSQL
WITH semester_interval_startdate AS (
SELECT
s.*
FROM
public.tbl_studiensemester s
WHERE
{$this->db->escape($from)}::date BETWEEN s.start AND s.ende
ORDER BY
s.start DESC
LIMIT 1
),
semester_interval_enddate AS (
SELECT
s.*
FROM
public.tbl_studiensemester s
WHERE
{$this->db->escape($to)}::date BETWEEN s.start AND s.ende
ORDER BY
s.start DESC
LIMIT 1
),
nearest_semester_interval_startdate AS (
SELECT
LEAST(ABS(s.start - {$this->db->escape($from)}::date), ABS(s.ende - {$this->db->escape($from)}::date)) AS mindiff,
s.*
FROM
public.tbl_studiensemester s
WHERE
s.ende < {$this->db->escape($from)}::date
ORDER BY
1 ASC
LIMIT 1
),
nearest_semester_interval_enddate AS (
SELECT
LEAST(ABS(s.start - {$this->db->escape($to)}::date), ABS(s.ende - {$this->db->escape($to)}::date)) AS mindiff,
s.*
FROM
public.tbl_studiensemester s
WHERE
s.start > {$this->db->escape($to)}::date
ORDER BY
1 ASC
LIMIT 1
)
SELECT
COALESCE(
(SELECT studiensemester_kurzbz FROM semester_interval_startdate),
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_startdate)
) AS studiensemester_kurzbz
UNION
SELECT
COALESCE(
(SELECT studiensemester_kurzbz FROM semester_interval_enddate),
(SELECT studiensemester_kurzbz FROM nearest_semester_interval_enddate)
) AS studiensemester_kurzbz
EOSQL;
return $this->execReadonlyQuery($query);
}
/**
* Gets all Studiensemester between two dates
* @param $from