aboutsummaryrefslogtreecommitdiff
path: root/lib/models/RangeTreeNode.php
diff options
context:
space:
mode:
authorThomas Hackl <hackl@data-quest.de>2024-03-21 08:04:46 +0000
committerThomas Hackl <hackl@data-quest.de>2024-03-21 08:04:46 +0000
commit9315424f1ff73d9a5d9461c37d00991bf6047484 (patch)
treec66bfaa144e9fea42180fd4ab1305e0e671283ba /lib/models/RangeTreeNode.php
parent62cbeb6fab048eab48833854ba16da9c22822a5a (diff)
Resolve "Anzahl der Veranstaltungen in der Unterebene beim VVZ passt nicht"
Closes #3852 Merge request studip/studip!2714
Diffstat (limited to 'lib/models/RangeTreeNode.php')
-rw-r--r--lib/models/RangeTreeNode.php101
1 files changed, 45 insertions, 56 deletions
diff --git a/lib/models/RangeTreeNode.php b/lib/models/RangeTreeNode.php
index 4c4ae0d..29d4bcd 100644
--- a/lib/models/RangeTreeNode.php
+++ b/lib/models/RangeTreeNode.php
@@ -122,33 +122,28 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode
*/
public function countCourses($semester_id = '', $semclass = 0, $with_children = false): int
{
- if ($semester_id) {
- $query = "SELECT COUNT(DISTINCT i.`seminar_id`)
- FROM `seminar_inst` i
- JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)
- LEFT JOIN `semester_courses` sc ON (i.`seminar_id` = sc.`course_id`)
- WHERE i.`institut_id` IN (
- SELECT DISTINCT `studip_object_id`
- FROM `range_tree`
- WHERE `item_id` IN (:ids)
- ) AND (
- sc.`semester_id` = :semester
- OR sc.`semester_id` IS NULL
- )";
+ $query = "SELECT COUNT(DISTINCT i.`seminar_id`) FROM `seminar_inst` i";
+
+ if ($semester_id !== 'all') {
+ $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)
+ LEFT JOIN `semester_courses` sc ON (i.`seminar_id` = sc.`course_id`)
+ WHERE sc.`semester_id` = :semester";
$parameters = [
- 'ids' => $with_children ? $this->getDescendantIds() : [$this->id],
'semester' => $semester_id
];
} else {
- $query = "SELECT COUNT(DISTINCT `seminar_id`)
- FROM `seminar_inst` i
- JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)
- WHERE `institut_id` IN (
- SELECT DISTINCT `studip_object_id`
- FROM `range_tree`
- WHERE `item_id` IN (:ids)
- )";
- $parameters = ['ids' => $with_children ? $this->getDescendantIds() : [$this->id]];
+ $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)";
+ $parameters = [];
+ }
+
+ if ($with_children) {
+ $query .= " AND i.`institut_id` IN (
+ SELECT DISTINCT `studip_object_id` FROM `range_tree` WHERE `item_id` IN (:ids)
+ )";
+ $parameters['ids'] = array_merge([$this->id], $this->getDescendantIds());
+ } else {
+ $query .= " AND i.`institut_id` = :id";
+ $parameters['id'] = $this->studip_object_id;
}
if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) {
@@ -179,48 +174,32 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode
array $courses = []
): array
{
- if ($semester_id !== 'all') {
- $query = "SELECT DISTINCT s.*
- FROM `seminare` s
- JOIN `seminar_inst` i ON (i.`seminar_id` = s.`Seminar_id`)
- LEFT JOIN `semester_courses` sem ON (sem.`course_id` = s.`Seminar_id`)
- WHERE i.`institut_id` IN (
- SELECT DISTINCT `studip_object_id`
- FROM `range_tree`
- WHERE `item_id` IN (:ids)
- ) AND (
- sem.`semester_id` = :semester
- OR sem.`semester_id` IS NULL
- )";
+ $query = "SELECT DISTINCT s.* FROM `seminar_inst` i";
+ if ($semester_id !== 'all') {
+ $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)
+ LEFT JOIN `semester_courses` sc ON (i.`seminar_id` = sc.`course_id`)
+ WHERE sc.`semester_id` = :semester";
$parameters = [
- 'ids' => $with_children ? $this->getDescendantIds() : [$this->id],
'semester' => $semester_id
];
} else {
- $query = "SELECT DISTINCT s.*
- FROM `seminare` s
- JOIN `seminar_inst` i ON (i.`seminar_id` = s.`Seminar_id`)
- WHERE i.`institut_id` IN (
- SELECT DISTINCT `studip_object_id`
- FROM `range_tree`
- WHERE `item_id` IN (:ids)
- )";
- $parameters = ['ids' => $with_children ? $this->getDescendantIds() : [$this->id]];
+ $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)";
+ $parameters = [];
}
- if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) {
- $query .= " AND s.`visible` = 1";
- }
-
- if ($searchterm) {
- $query .= " AND s.`Name` LIKE :searchterm";
- $parameters['searchterm'] = '%' . trim($searchterm) . '%';
+ if ($with_children) {
+ $query .= " AND i.`institut_id` IN (
+ SELECT DISTINCT `studip_object_id` FROM `range_tree` WHERE `item_id` IN (:ids)
+ )";
+ $parameters['ids'] = array_merge([$this->id], $this->getDescendantIds());
+ } else {
+ $query .= " AND i.`institut_id` = :id";
+ $parameters['id'] = $this->studip_object_id;
}
- if ($courses) {
- $query .= " AND s.`Seminar_id` IN (:courses)";
- $parameters['courses'] = $courses;
+ if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) {
+ $query .= " AND s.`visible` = 1";
}
if ($semclass !== 0) {
@@ -236,6 +215,16 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode
);
}
+ if ($searchterm) {
+ $query .= " AND s.`Name` LIKE :searchterm";
+ $parameters['searchterm'] = '%' . trim($searchterm) . '%';
+ }
+
+ if ($courses) {
+ $query .= " AND t.`seminar_id` IN (:courses)";
+ $parameters['courses'] = $courses;
+ }
+
if (Config::get()->IMPORTANT_SEMNUMBER) {
$query .= " ORDER BY s.`start_time`, s.`VeranstaltungsNummer`, s.`Name`";
} else {