Skip to content
Snippets Groups Projects
Commit eee175d0 authored by Thomas Hackl's avatar Thomas Hackl
Browse files

Resolve "Anzahl der Veranstaltungen in der Unterebene beim VVZ passt nicht"

Closes #3852

Merge request studip/studip!2714
parent ca66100b
No related branches found
No related tags found
No related merge requests found
...@@ -122,33 +122,28 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode ...@@ -122,33 +122,28 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode
*/ */
public function countCourses($semester_id = '', $semclass = 0, $with_children = false): int 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";
$query = "SELECT COUNT(DISTINCT i.`seminar_id`)
FROM `seminar_inst` i if ($semester_id !== 'all') {
JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`) $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)
LEFT JOIN `semester_courses` sc ON (i.`seminar_id` = sc.`course_id`) LEFT JOIN `semester_courses` sc ON (i.`seminar_id` = sc.`course_id`)
WHERE i.`institut_id` IN ( WHERE sc.`semester_id` = :semester";
SELECT DISTINCT `studip_object_id`
FROM `range_tree`
WHERE `item_id` IN (:ids)
) AND (
sc.`semester_id` = :semester
OR sc.`semester_id` IS NULL
)";
$parameters = [ $parameters = [
'ids' => $with_children ? $this->getDescendantIds() : [$this->id],
'semester' => $semester_id 'semester' => $semester_id
]; ];
} else { } else {
$query = "SELECT COUNT(DISTINCT `seminar_id`) $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)";
FROM `seminar_inst` i $parameters = [];
JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`) }
WHERE `institut_id` IN (
SELECT DISTINCT `studip_object_id` if ($with_children) {
FROM `range_tree` $query .= " AND i.`institut_id` IN (
WHERE `item_id` IN (:ids) SELECT DISTINCT `studip_object_id` FROM `range_tree` WHERE `item_id` IN (:ids)
)"; )";
$parameters = ['ids' => $with_children ? $this->getDescendantIds() : [$this->id]]; $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)) { if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) {
...@@ -179,50 +174,34 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode ...@@ -179,50 +174,34 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode
array $courses = [] array $courses = []
): array ): array
{ {
if ($semester_id !== 'all') { $query = "SELECT DISTINCT s.* FROM `seminar_inst` i";
$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
)";
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 = [ $parameters = [
'ids' => $with_children ? $this->getDescendantIds() : [$this->id],
'semester' => $semester_id 'semester' => $semester_id
]; ];
} else { } else {
$query = "SELECT DISTINCT s.* $query .= " JOIN `seminare` s ON (s.`Seminar_id` = i.`seminar_id`)";
FROM `seminare` s $parameters = [];
JOIN `seminar_inst` i ON (i.`seminar_id` = s.`Seminar_id`) }
WHERE i.`institut_id` IN (
SELECT DISTINCT `studip_object_id` if ($with_children) {
FROM `range_tree` $query .= " AND i.`institut_id` IN (
WHERE `item_id` IN (:ids) SELECT DISTINCT `studip_object_id` FROM `range_tree` WHERE `item_id` IN (:ids)
)"; )";
$parameters = ['ids' => $with_children ? $this->getDescendantIds() : [$this->id]]; $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)) { if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) {
$query .= " AND s.`visible` = 1"; $query .= " AND s.`visible` = 1";
} }
if ($searchterm) {
$query .= " AND s.`Name` LIKE :searchterm";
$parameters['searchterm'] = '%' . trim($searchterm) . '%';
}
if ($courses) {
$query .= " AND s.`Seminar_id` IN (:courses)";
$parameters['courses'] = $courses;
}
if ($semclass !== 0) { if ($semclass !== 0) {
$query .= " AND s.`status` IN (:types)"; $query .= " AND s.`status` IN (:types)";
$parameters['types'] = array_map( $parameters['types'] = array_map(
...@@ -236,6 +215,16 @@ class RangeTreeNode extends SimpleORMap implements StudipTreeNode ...@@ -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) { if (Config::get()->IMPORTANT_SEMNUMBER) {
$query .= " ORDER BY s.`start_time`, s.`VeranstaltungsNummer`, s.`Name`"; $query .= " ORDER BY s.`start_time`, s.`VeranstaltungsNummer`, s.`Name`";
} else { } else {
......
...@@ -481,28 +481,32 @@ class StudipStudyArea extends SimpleORMap implements StudipTreeNode ...@@ -481,28 +481,32 @@ class StudipStudyArea extends SimpleORMap implements StudipTreeNode
/** /**
* @see StudipTreeNode::countCourses() * @see StudipTreeNode::countCourses()
*/ */
public function countCourses($semester_id = 'all', $semclass = 0, $with_children = false) :int public function countCourses(
$semester_id = 'all',
$semclass = 0,
$with_children = false
) :int
{ {
$query = "SELECT COUNT(DISTINCT t.`seminar_id`) FROM `seminar_sem_tree` t";
if ($semester_id !== 'all') { if ($semester_id !== 'all') {
$query = "SELECT COUNT(DISTINCT t.`seminar_id`) $query .= " JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`)
FROM `seminar_sem_tree` t
JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`)
LEFT JOIN `semester_courses` sc ON (t.`seminar_id` = sc.`course_id`) LEFT JOIN `semester_courses` sc ON (t.`seminar_id` = sc.`course_id`)
WHERE t.`sem_tree_id` IN (:ids) WHERE sc.`semester_id` = :semester";
AND (
sc.`semester_id` = :semester
OR sc.`semester_id` IS NULL
)";
$parameters = [ $parameters = [
'ids' => $with_children ? array_merge([$this->id], $this->getDescendantIds()) : [$this->id],
'semester' => $semester_id 'semester' => $semester_id
]; ];
} else { } else {
$query = "SELECT COUNT(DISTINCT t.`seminar_id`) $query .= " JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`)";
FROM `seminar_sem_tree` t $parameters = [];
JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`) }
WHERE `sem_tree_id` IN (:ids)";
$parameters = ['ids' => $with_children ? array_merge([$this->id], $this->getDescendantIds()) : [$this->id]]; if ($with_children) {
$query .= " AND t.`sem_tree_id` IN (:ids)";
$parameters['ids'] = array_merge([$this->id], $this->getDescendantIds());
} else {
$query .= " AND t.`sem_tree_id` = :id";
$parameters['id'] = $this->id;
} }
if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) { if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) {
...@@ -533,26 +537,26 @@ class StudipStudyArea extends SimpleORMap implements StudipTreeNode ...@@ -533,26 +537,26 @@ class StudipStudyArea extends SimpleORMap implements StudipTreeNode
array $courses = [] array $courses = []
): array ): array
{ {
$query = "SELECT DISTINCT s.* FROM `seminar_sem_tree` t";
if ($semester_id !== 'all') { if ($semester_id !== 'all') {
$query = "SELECT DISTINCT s.* $query .= " JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`)
FROM `seminare` s LEFT JOIN `semester_courses` sc ON (t.`seminar_id` = sc.`course_id`)
JOIN `seminar_sem_tree` t ON (t.`seminar_id` = s.`Seminar_id`) WHERE sc.`semester_id` = :semester";
LEFT JOIN `semester_courses` sem ON (sem.`course_id` = s.`Seminar_id`)
WHERE t.`sem_tree_id` IN (:ids)
AND (
sem.`semester_id` = :semester
OR sem.`semester_id` IS NULL
)";
$parameters = [ $parameters = [
'ids' => $with_children ? $this->getDescendantIds() : [$this->id],
'semester' => $semester_id 'semester' => $semester_id
]; ];
} else { } else {
$query = "SELECT DISTINCT s.* $query .= " JOIN `seminare` s ON (s.`Seminar_id` = t.`seminar_id`)";
FROM `seminare` s $parameters = [];
JOIN `seminar_sem_tree` t ON (t.`seminar_id` = s.`Seminar_id`) }
WHERE t.`sem_tree_id` IN (:ids)";
$parameters = ['ids' => $with_children ? $this->getDescendantIds() : [$this->id]]; if ($with_children) {
$query .= " AND t.`sem_tree_id` IN (:ids)";
$parameters['ids'] = array_merge([$this->id], $this->getDescendantIds());
} else {
$query .= " AND t.`sem_tree_id` = :id";
$parameters['id'] = $this->id;
} }
if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) { if (!$GLOBALS['perm']->have_perm(Config::get()->SEM_VISIBILITY_PERM)) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment