diff --git a/app/controllers/admission/restricted_courses.php b/app/controllers/admission/restricted_courses.php index 371ea5de5ff749ef2e9a472604612779b6aa6f36..1a4a19149c229bc5231f3574ad341445d15fab4d 100644 --- a/app/controllers/admission/restricted_courses.php +++ b/app/controllers/admission/restricted_courses.php @@ -56,10 +56,10 @@ class Admission_RestrictedCoursesController extends AuthenticatedController } $semester = Semester::find($this->current_semester_id); $sem_condition .= " - AND (semester_courses.semester_id IS NULL OR semester_courses.semester_id = " . DBManager::get()->quote($semester->getId()) . ") + AND (`semester_courses`.`semester_id` IS NULL OR `semester_courses`.`semester_id` = " . DBManager::get()->quote($semester->getId()) . ") "; if ($this->sem_name_prefix) { - $sem_condition .= sprintf('AND (seminare.Name LIKE %1$s OR seminare.VeranstaltungsNummer LIKE %1$s) ', DBManager::get()->quote($this->sem_name_prefix . '%')); + $sem_condition .= sprintf('AND (`seminare`.`Name` LIKE %1$s OR `seminare`.`VeranstaltungsNummer` LIKE %1$s) ', DBManager::get()->quote($this->sem_name_prefix . '%')); } if ($GLOBALS['perm']->have_perm('dozent')) { $this->my_inst = $this->get_institutes($sem_condition); @@ -72,6 +72,7 @@ class Admission_RestrictedCoursesController extends AuthenticatedController foreach (words('current_institut_id sem_name_prefix') as $param) { $_SESSION[get_class($this)][$param] = $this->$param; } + $this->additional_data = []; if (Request::get('csv')) { $captions = [_("Anmeldeset"), _("Nummer"), @@ -86,19 +87,34 @@ class Admission_RestrictedCoursesController extends AuthenticatedController _("Endzeitpunkt")]; $data = []; foreach ($this->courses as $course) { - $sorm_course = Course::find($course['seminare.seminar_id']); + $additional_data = $this->getAdditionalCourseData($course); + + $start_time = ''; + + $start_semester = $course->getStartSemester(); + if ($start_semester) { + $start_time = date('d.m.Y H:i', $start_semester->beginn); + } + + $end_time = ''; + + $end_semester = $course->getEndSemester(); + if ($end_semester) { + $end_time = date('d.m.Y H:i', $end_semester->ende); + } + $row = []; - $row[] = $course['cs_name']; - $row[] = $course['course_number']; - $row[] = $course['course_name']; - $row[] = (int)$course['admission_turnout']; - $row[] = $course['count_teilnehmer'] + $course['count_prelim']; - $row[] = (int)$course['count_claiming']; - $row[] = (int)$course['count_prelim']; - $row[] = (int)$course['count_waiting']; - $row[] = $course['distribution_time'] ? strftime('%x %R', $course['distribution_time']) : ''; - $row[] = $sorm_course?->getStartSemester()?->beginn ?? ''; - $row[] = $sorm_course?->getEndSemester()?->ende ?? ''; + $row[] = $additional_data['courseset_name']; + $row[] = $course->veranstaltungsnummer; + $row[] = $course->name; + $row[] = (int)$course->admission_turnout ?: ''; + $row[] = $additional_data['participant_count'] + $additional_data['accepted_count']; + $row[] = (int)$additional_data['claiming_count']; + $row[] = (int)$additional_data['accepted_count']; + $row[] = (int)$additional_data['awaiting_count']; + $row[] = $additional_data['distribution_time'] ? date('d.m.Y H:i', $additional_data['distribution_time']) : ''; + $row[] = $start_time; + $row[] = $end_time; $data[] = $row; } @@ -112,7 +128,14 @@ class Admission_RestrictedCoursesController extends AuthenticatedController ); return; } + } else { + //We need to loop over each course and fetch additional data to fill the + //not_distributed_coursesets attribute before showing the view. + foreach ($this->courses as $course) { + $this->additional_data[$course->id] = $this->getAdditionalCourseData($course); + } } + if (is_array($this->not_distributed_coursesets)) { PageLayout::postInfo( _("Es existieren Anmeldesets, die zum Zeitpunkt der Platzverteilung nicht gelost wurden. Stellen Sie sicher, dass der Cronjob \"Losverfahren überprüfen\" ausgeführt wird."), @@ -120,83 +143,92 @@ class Admission_RestrictedCoursesController extends AuthenticatedController } } - function get_courses($seminare_condition) + /** + * Fetches additional data for a course and sets the not_distributed_coursesets + * attribute in some cases. + * + * @param Course $course The course to fetch data for. + * + * @return array An associative array with additional data. + */ + protected function getAdditionalCourseData(Course $course) : array + { + $data = []; + + $courseset = $course->getCourseSet(); + if ($courseset) { + $data['courseset_id'] = $courseset->getId(); + $data['courseset_name'] = $courseset->getName(); + if ($courseset->hasAlgorithmRun()) { + $data['claiming_count'] = 0; + } else { + $data['claiming_count'] = count(AdmissionPriority::getPrioritiesByCourse($courseset->getId(), $course->id)); + } + $data['distribution_time'] = $courseset->getSeatDistributionTime(); + if ( + $data['distribution_time'] < time() - 1000 + && !$courseset->hasAlgorithmRun() + ) { + $this->not_distributed_coursesets[] = $courseset->getName(); + } + + $timed_admission = $courseset->getAdmissionRule(TimedAdmission::class); + if ($timed_admission) { + $data['admission_start_time'] = $timed_admission->getStartTime(); + $data['admission_end_time'] = $timed_admission->getEndTime(); + } + } else { + $data['courseset_id'] = ''; + $data['courseset_name'] = ''; + $data['claiming_count'] = 0; + $data['distribution_time'] = 0; + $data['admission_start_time'] = ''; + $data['admission_end_time'] = ''; + } + $data['participant_count'] = CourseMember::countByCourseAndStatus($course->id, ['user', 'autor']); + $data['accepted_count'] = AdmissionApplication::countBySql( + "`seminar_id` = :course_id AND `status` = 'accepted'", + ['course_id' => $course->id] + ); + $data['awaiting_count'] = AdmissionApplication::countBySql( + "`seminar_id` = :course_id AND `status` = 'awaiting'", + ['course_id' => $course->id] + ); + + return $data; + } + + protected function get_courses($seminare_condition) { $chunks = explode('_', $this->current_institut_id); $institut_id = $chunks[0]; $all = $chunks[1] ?? null; - // Prepare count statements - $query = "SELECT count(*) - FROM seminar_user - WHERE seminar_id = ? AND status IN ('user', 'autor')"; - $count0_statement = DBManager::get()->prepare($query); - - $query = "SELECT SUM(status = 'accepted') AS count2, - SUM(status = 'awaiting') AS count3 - FROM admission_seminar_user - WHERE seminar_id = ? - GROUP BY seminar_id"; - $count1_statement = DBManager::get()->prepare($query); $parameters = []; - $sql = "SELECT seminare.seminar_id,seminare.Name as course_name,seminare.VeranstaltungsNummer as course_number, - admission_prelim, admission_turnout,seminar_courseset.set_id - FROM seminar_courseset - INNER JOIN courseset_rule csr ON csr.set_id=seminar_courseset.set_id AND csr.type='ParticipantRestrictedAdmission' - INNER JOIN seminare ON seminar_courseset.seminar_id=seminare.seminar_id - LEFT JOIN semester_courses ON (seminare.Seminar_id = semester_courses.course_id) + $sql = "JOIN `seminar_courseset` + USING (`seminar_id`) + JOIN `courseset_rule` csr + ON csr.`set_id` = `seminar_courseset`.`set_id` + AND csr.`type` = 'ParticipantRestrictedAdmission' + LEFT JOIN `semester_courses` + ON `seminare`.`Seminar_id` = `semester_courses`.`course_id` "; if ($institut_id === 'all' && $GLOBALS['perm']->have_perm('root')) { $sql .= "WHERE 1 {$seminare_condition} "; } elseif ($all == 'all') { $sql .= "INNER JOIN Institute USING (Institut_id) - WHERE Institute.fakultaets_id = ? {$seminare_condition} + WHERE Institute.fakultaets_id = :faculty_id {$seminare_condition} "; - $parameters[] = $institut_id; + $parameters['faculty_id'] = $institut_id; } else { - $sql .= "WHERE seminare.Institut_id = ? {$seminare_condition} + $sql .= "WHERE seminare.Institut_id = :institute_id {$seminare_condition} "; - $parameters[] = $institut_id; + $parameters['institute_id'] = $institut_id; } - $sql .= "GROUP BY seminare.Seminar_id ORDER BY seminar_courseset.set_id, seminare.Name"; - - $statement = DBManager::get()->prepare($sql); - $statement->execute($parameters); - $csets = []; - $ret = []; - while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { - $seminar_id = $row['seminar_id']; - $ret[$seminar_id] = $row; + $sql .= "GROUP BY `seminare`.`Seminar_id` ORDER BY `seminar_courseset`.`set_id`, `seminare`.`Name`"; - $count0_statement->execute([$seminar_id]); - $count = $count0_statement->fetchColumn(); - - $ret[$seminar_id]['count_teilnehmer'] = $count; - - $count1_statement->execute([$seminar_id]); - $counts = $count1_statement->fetch(PDO::FETCH_ASSOC); - - $ret[$seminar_id]['count_prelim'] = (int) ($counts['count2'] ?? 0); - $ret[$seminar_id]['count_waiting'] = (int) ($counts['count3'] ?? 0); - if (!isset($csets[$row['set_id']])) { - $csets[$row['set_id']] = new CourseSet($row['set_id']); - } - $cs = $csets[$row['set_id']]; - $ret[$seminar_id]['cs_name'] = $cs->getName(); - $ret[$seminar_id]['distribution_time'] = $cs->getSeatDistributionTime(); - if ($ret[$seminar_id]['distribution_time'] < (time() - 1000) && !$cs->hasAlgorithmRun()) { - $this->not_distributed_coursesets[] = $cs->getName(); - } - if ($ta = $cs->getAdmissionRule('TimedAdmission')) { - $ret[$seminar_id]['start_time'] = $ta->getStartTime(); - $ret[$seminar_id]['end_time'] = $ta->getEndTime(); - } - if (!$cs->hasAlgorithmRun()) { - $ret[$seminar_id]['count_claiming'] = count(AdmissionPriority::getPrioritiesByCourse($row['set_id'], $seminar_id)); - } - } - return $ret; + return Course::findBySql($sql, $parameters); } function get_institutes($seminare_condition) diff --git a/app/views/admission/restricted_courses/index.php b/app/views/admission/restricted_courses/index.php index a7503e48c3c8e5bdbfde686a52fdeff85bbf7403..fa78f62333edd99b74c556338a40df5495ef31da 100644 --- a/app/views/admission/restricted_courses/index.php +++ b/app/views/admission/restricted_courses/index.php @@ -1,6 +1,7 @@ <?php /** - * @var array $courses + * @var Course[] $courses + * @var array[] $additional_data */ ?> <?= $this->render_partial('admission/restricted_courses/_institute_choose.php')?> @@ -22,30 +23,37 @@ </thead> <tbody> <? foreach ($courses as $course) : ?> + <?php + $additional = $additional_data[$course->id]; + ?> <tr> - <td><a href="<?= URLHelper::getLink('dispatch.php/admission/courseset/configure/' . $course['set_id'])?>"><?= htmlReady($course['cs_name'])?></td> - <td><a href="<?= URLHelper::getLink('dispatch.php/course/members/index', ['cid' => $course['seminar_id']])?>"><?= htmlReady(($course['course_number'] ? $course['course_number'] .'|' : '') . $course['course_name'])?></a></td> - <td><?= htmlReady($course['admission_turnout'])?></td> + <td><a href="<?= URLHelper::getLink('dispatch.php/admission/courseset/configure/' . $additional['courseset_id']) ?>"><?= htmlReady($additional['courseset_name']) ?></td> <td> - <?= htmlReady($course['count_teilnehmer'] + $course['count_prelim'])?> - <? if ($course['admission_prelim'] && $course['count_prelim']) : ?> - <?= tooltipIcon(_('vorläufige Teilnahme: ') . $course['count_prelim']) ?> + <a href="<?= URLHelper::getLink('dispatch.php/course/members/index', ['cid' => $course->id])?>"> + <?= htmlReady($course->getFullName()) ?> + </a> + </td> + <td><?= htmlReady($course->admission_turnout ?: '') ?></td> + <td> + <?= htmlReady($additional['participant_count'] + $additional['accepted_count'])?> + <? if ($course->admission_prelim && $additional['accepted_count']) : ?> + <?= tooltipIcon(_('vorläufige Teilnahme: ') . $additional['accepted_count']) ?> <? endif ?> </td> - <td data-value="<?= $course['count_claiming'] ?? 0 ?>"> - <?= htmlReady(isset($course['count_claiming']) ? $course['count_claiming'] : '-') ?> + <td data-value="<?= $additional['claiming_count'] ?? 0 ?>"> + <?= htmlReady($additional['claiming_count'] ?? '-') ?> </td> - <td data-sort-value="<?= $course['count_waiting'] ?? 0 ?>"> - <?= htmlReady(isset($course['count_waiting']) ? $course['count_waiting'] : '-') ?> + <td data-sort-value="<?= $additional['awaiting_count'] ?? 0 ?>"> + <?= htmlReady($additional['awaiting_count'] ?? '-') ?> </td> - <td style="white-space:nowrap" data-sort-value="<?= (int) $course['distribution_time']?>"> - <?= htmlReady($course['distribution_time'] ? strftime('%x %R', $course['distribution_time']) : '-') ?> + <td style="white-space:nowrap" data-sort-value="<?= (int) $additional['distribution_time']?>"> + <?= htmlReady($additional['distribution_time'] ? date('d.m.Y H:i', $additional['distribution_time']) : '-') ?> </td> <td style="white-space:nowrap" data-sort-value="<?= (int) ($course->start_semester->beginn ?? null) ?>"> - <?= htmlReady(($course->start_semester instanceof Semester) ? strftime('%x %R', $course->start_semester->beginn) : '-') ?> + <?= date('d.m.Y H:i', $course->start_semester->beginn) ?> </td> <td style="white-space:nowrap" data-sort-value="<?= (int) ($course->end_semester->ende ?? null) ?>"> - <?= htmlReady(($course->end_semester instanceof Semester) ? strftime('%x %R', $course->end_semester->ende) : '-') ?> + <?= $course->end_semester ? date('d.m.Y H:i', $course->end_semester->ende) : '-' ?> </td> </tr> <? endforeach ?>