/**
  * Distribute seats for several courses in a course set.
  * No priorities are given.
  *
  * @param CourseSet $courseSet The course set containing the courses
  * that seats shall be distributed for.
  * @see CourseSet
  */
 private function distributeByCourses($courseSet)
 {
     Log::DEBUG('start seat distribution for course set: ' . $courseSet->getId());
     foreach ($courseSet->getCourses() as $course_id) {
         $course = Course::find($course_id);
         $free_seats = $course->getFreeSeats();
         $claiming_users = AdmissionPriority::getPrioritiesByCourse($courseSet->getId(), $course->id);
         $factored_users = $courseSet->getUserFactorList();
         //apply bonus/malus to users, exclude participants
         foreach (array_keys($claiming_users) as $user_id) {
             if (!$course->getParticipantStatus($user_id)) {
                 $claiming_users[$user_id] = 1;
                 if (isset($factored_users[$user_id])) {
                     $claiming_users[$user_id] *= $factored_users[$user_id];
                 }
                 Log::DEBUG(sprintf('user %s gets factor %s', $user_id, $claiming_users[$user_id]));
             } else {
                 unset($claiming_users[$user_id]);
                 Log::DEBUG(sprintf('user %s is already %s, ignoring', $user_id, $course->getParticipantStatus($user_id)));
             }
         }
         Log::DEBUG(sprintf('distribute %s seats on %s claiming in course %s', $free_seats, count($claiming_users), $course->id));
         $claiming_users = $this->rollTheDice($claiming_users);
         Log::DEBUG('the die is cast: ' . print_r($claiming_users, 1));
         $chosen_ones = array_slice(array_keys($claiming_users), 0, $free_seats);
         Log::DEBUG('chosen ones: ' . print_r($chosen_ones, 1));
         $this->addUsersToCourse($chosen_ones, $course);
         if ($free_seats < count($claiming_users)) {
             if (!$course->admission_disable_waitlist) {
                 $free_seats_waitlist = $course->admission_waitlist_max ?: count($claiming_users) - $free_seats;
                 $waiting_list_ones = array_slice(array_keys($claiming_users), $free_seats, $free_seats_waitlist);
                 Log::DEBUG('waiting list ones: ' . print_r($waiting_list_ones, 1));
                 $this->addUsersToWaitlist($waiting_list_ones, $course);
             } else {
                 $free_seats_waitlist = 0;
             }
             if ($free_seats_waitlist + $free_seats < count($claiming_users)) {
                 $remaining_ones = array_slice(array_keys($claiming_users), $free_seats_waitlist + $free_seats);
                 Log::DEBUG('remaining ones: ' . print_r($remaining_ones, 1));
                 $this->notifyRemainingUsers($remaining_ones, $course);
             }
         }
     }
 }
/**
* Exports member-list for a Stud.IP-lecture.
*
* This function gets the data of the members of a lecture and writes it into $data_object.
* It calls output_data afterwards.
*
* @access   public
* @param        string  $inst_id    Stud.IP-inst_id for export
* @param        string  $ex_sem_id  allows to choose which lecture is to be exported
*/
function export_teilis($inst_id, $ex_sem_id = "no")
{
    global $range_id, $xml_file, $o_mode, $xml_names_person, $xml_groupnames_person, $xml_names_studiengaenge, $xml_groupnames_studiengaenge, $object_counter, $filter, $SEM_CLASS, $SEM_TYPE, $SessSemName;
    if ($filter == 'status') {
        $query = "SELECT statusgruppe_id, name\n                  FROM statusgruppen\n                  WHERE range_id = ?\n                  ORDER BY position ASC";
        $statement = DBManager::get()->prepare($query);
        $statement->execute(array($ex_sem_id));
        $gruppe = $statement->fetchGrouped(PDO::FETCH_COLUMN);
        $gruppe['no'] = _('keiner Funktion oder Gruppe zugeordnet');
    } else {
        if (!in_array($filter, words('awaiting claiming'))) {
            if (!$SEM_CLASS[$SEM_TYPE[$SessSemName['art_num']]['class']]['workgroup_mode']) {
                $gruppe = array('dozent' => _('Lehrende'), 'tutor' => _('Tutor/-innen'), 'autor' => _('Studierende'), 'user' => _('Leser/-innen'), 'accepted' => _('Vorläufig akzeptierte Personen'));
            } else {
                $gruppe = array('dozent' => _('Leitung'), 'tutor' => _('Mitglieder'), 'autor' => _('Autor/-innen'), 'user' => _('Leser/-innen'), 'accepted' => _('Vorläufig akzeptierte Personen'));
            }
        } else {
            $gruppe[$filter] = _('Anmeldeliste');
        }
    }
    $data_object .= xml_open_tag($xml_groupnames_person['group']);
    while (list($key1, $val1) = each($gruppe)) {
        $parameters = array();
        if ($filter == 'status') {
            // Gruppierung nach Statusgruppen / Funktionen
            if ($key1 == 'no') {
                $query = "SELECT ui.*, aum.*, su.*, FROM_UNIXTIME(su.mkdate) AS registration_date,\n                                 GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n                          FROM seminar_user AS su\n                          LEFT JOIN auth_user_md5 AS aum USING (user_id)\n                          LEFT JOIN user_info AS ui USING (user_id)\n                          LEFT JOIN user_studiengang USING (user_id)\n                          LEFT JOIN studiengaenge AS sg USING(studiengang_id)\n                          LEFT JOIN abschluss AS a USING (abschluss_id)\n                          WHERE seminar_id = :seminar_id\n                          GROUP BY aum.user_id\n                          ORDER BY Nachname";
                $parameters[':seminar_id'] = $ex_sem_id;
            } else {
                $query = "SELECT DISTINCT ui.*, aum.*, su.*, FROM_UNIXTIME(su.mkdate) AS registration_date,\n                                 GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n                          FROM statusgruppe_user\n                          LEFT JOIN seminar_user AS su USING (user_id)\n                          LEFT JOIN auth_user_md5 AS aum USING (user_id)\n                          LEFT JOIN user_info AS ui USING (user_id)\n                          LEFT JOIN user_studiengang USING(user_id)\n                          LEFT JOIN studiengaenge AS sg USING(studiengang_id)\n                          LEFT JOIN abschluss AS a USING (abschluss_id)\n                          WHERE statusgruppe_id = :statusgruppe_id AND seminar_id = :seminar_id\n                          GROUP BY aum.user_id\n                          ORDER BY Nachname";
                $parameters[':seminar_id'] = $ex_sem_id;
                $parameters[':statusgruppe_id'] = $key1;
            }
        } else {
            if ($key1 == 'accepted') {
                $query = "SELECT ui.*, aum.*, asu.comment,\n                             FROM_UNIXTIME(asu.mkdate) AS registration_date,\n                             GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n                      FROM admission_seminar_user AS asu\n                      LEFT JOIN user_info AS ui USING (user_id)\n                      LEFT JOIN auth_user_md5 AS aum USING (user_id)\n                      LEFT JOIN user_studiengang USING (user_id)\n                      LEFT JOIN studiengaenge AS sg ON (user_studiengang.studiengang_id = sg.studiengang_id)\n                      LEFT JOIN abschluss AS a USING (abschluss_id)\n                      WHERE seminar_id = :seminar_id AND asu.status = 'accepted'\n                      GROUP BY aum.user_id\n                      ORDER BY Nachname";
                $parameters[':seminar_id'] = $ex_sem_id;
            } elseif ($key1 == 'awaiting') {
                $query = "SELECT ui.*, aum.*, asu.comment,\n                             asu.position AS admission_position,\n                             GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n                        FROM admission_seminar_user AS asu\n                        LEFT JOIN user_info AS ui USING(user_id)\n                        LEFT JOIN auth_user_md5 AS aum USING(user_id)\n                        LEFT JOIN user_studiengang USING(user_id)\n                        LEFT JOIN studiengaenge AS sg ON (user_studiengang.studiengang_id = sg.studiengang_id)\n                        LEFT JOIN abschluss AS a USING (abschluss_id)\n                        WHERE asu.seminar_id = :seminar_id AND asu.status != 'accepted'\n                        GROUP BY aum.user_id ORDER BY position";
                $parameters[':seminar_id'] = $ex_sem_id;
            } elseif ($key1 == 'claiming') {
                $cs = CourseSet::getSetForCourse($ex_sem_id);
                if (is_object($cs) && !$cs->hasAlgorithmRun()) {
                    $parameters[':users'] = array_keys(AdmissionPriority::getPrioritiesByCourse($cs->getId(), $ex_sem_id));
                } else {
                    $parameters[':users'] = array();
                }
                $query = "SELECT ui.*, aum.*, '' as comment,\n                             0  AS admission_position,\n                             GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n                        FROM auth_user_md5 AS aum\n                        INNER JOIN user_info AS ui USING(user_id)\n                        LEFT JOIN user_studiengang USING(user_id)\n                        LEFT JOIN studiengaenge AS sg ON (user_studiengang.studiengang_id = sg.studiengang_id)\n                        LEFT JOIN abschluss AS a USING (abschluss_id)\n                        WHERE aum.user_id IN (:users)\n                        GROUP BY aum.user_id ORDER BY Nachname";
            } else {
                $query = "SELECT ui.*, aum.*, su.*, FROM_UNIXTIME(su.mkdate) AS registration_date,\n                             GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, us.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n                      FROM seminar_user AS su\n                      LEFT JOIN auth_user_md5 AS aum USING ( user_id )\n                      LEFT JOIN user_info AS ui USING ( user_id )\n                      LEFT JOIN user_studiengang AS us USING(user_id)\n                      LEFT JOIN studiengaenge AS sg USING (studiengang_id)\n                      LEFT JOIN abschluss AS a USING (abschluss_id)\n                      WHERE seminar_id = :seminar_id AND su.status = :status\n                      GROUP BY aum.user_id\n                      ORDER BY " . ($key1 == 'dozent' ? 'position, ' : '') . "Nachname";
                $parameters[':seminar_id'] = $ex_sem_id;
                $parameters[':status'] = $key1;
            }
        }
        $statement = DBManager::get()->prepare($query);
        $statement->execute($parameters);
        $data = $statement->fetchAll(PDO::FETCH_ASSOC);
        $data_object_tmp = '';
        $object_counter_tmp = $object_counter;
        if (count($data) > 0) {
            $data_object_tmp .= xml_open_tag($xml_groupnames_person['subgroup1'], $val1);
            foreach ($data as $row) {
                // Nur Personen ausgeben, die entweder einer Gruppe angehoeren
                // oder zur Veranstaltung gehoeren und noch nicht ausgegeben wurden.
                if ($key1 != 'no' || $person_out[$row['user_id']] != true) {
                    $object_counter += 1;
                    $data_object_tmp .= xml_open_tag($xml_groupnames_person["object"], $row['username']);
                    reset($xml_names_person);
                    while (list($key, $val) = each($xml_names_person)) {
                        if ($val == '') {
                            $val = $key;
                        }
                        if ($row[$key] != '') {
                            $data_object_tmp .= xml_tag($val, $row[$key]);
                        }
                    }
                    // freie Datenfelder ausgeben
                    $data_object_tmp .= export_datafields($row['user_id'], $xml_groupnames_person['childgroup1'], $xml_groupnames_person['childobject1'], 'user');
                    $data_object_tmp .= xml_close_tag($xml_groupnames_person['object']);
                    $person_out[$row['user_id']] = true;
                }
            }
            $data_object_tmp .= xml_close_tag($xml_groupnames_person['subgroup1']);
            if ($object_counter_tmp != $object_counter) {
                $data_object .= $data_object_tmp;
            }
        }
    }
    $data_object .= xml_close_tag($xml_groupnames_person['group']);
    if (!in_array($filter, words('status awaiting accepted'))) {
        $query = "SELECT CONCAT_WS(',', studiengaenge.name, abschluss.name) AS name, COUNT(*) AS c\n                  FROM seminar_user\n                  INNER JOIN user_studiengang USING (user_id)\n                  LEFT JOIN studiengaenge USING (studiengang_id)\n                  LEFT JOIN abschluss USING (abschluss_id)\n                  WHERE seminar_id = ?\n                  GROUP BY name";
        $statement = DBManager::get()->prepare($query);
        $statement->execute(array($ex_sem_id));
        $studiengang_count = $statement->fetchGrouped(PDO::FETCH_COLUMN);
        if (count($studiengang_count) > 0) {
            $data_object .= xml_open_tag($xml_groupnames_studiengaenge["group"]);
            for ($i = 0; $i < count($studiengang_count); $i += 1) {
                // TODO: Is this really neccessary?
                while (list($key, $val) = each($studiengang_count)) {
                    $data_object .= xml_open_tag($xml_groupnames_studiengaenge['object']);
                    $data_object .= xml_tag($xml_names_studiengaenge['name'], $key);
                    $data_object .= xml_tag($xml_names_studiengaenge['count'], $val);
                    $data_object .= xml_close_tag($xml_groupnames_studiengaenge['object']);
                }
            }
            $data_object .= xml_close_tag($xml_groupnames_studiengaenge['group']);
        }
    }
    output_data($data_object, $o_mode);
}
Exemple #3
0
 /**
  * Lets the user compose a message and send it.
  */
 public function write_action()
 {
     PageLayout::setTitle(_("Neue Nachricht schreiben"));
     //collect possible default adressees
     $this->to = array();
     $this->default_message = new Message();
     if (Request::username("rec_uname")) {
         $user = new MessageUser();
         $user->setData(array('user_id' => get_userid(Request::username("rec_uname")), 'snd_rec' => "rec"));
         $this->default_message->receivers[] = $user;
     }
     if (Request::getArray("rec_uname")) {
         foreach (Request::usernameArray("rec_uname") as $username) {
             $user = new MessageUser();
             $user->setData(array('user_id' => get_userid($username), 'snd_rec' => "rec"));
             $this->default_message->receivers[] = $user;
         }
     }
     if (Request::option("group_id")) {
         $this->default_message->receivers = array();
         $group = Statusgruppen::find(Request::option("group_id"));
         if ($group['range_id'] === $GLOBALS['user']->id || $GLOBALS['perm']->have_studip_perm("autor", $group['range_id'])) {
             foreach ($group->members as $member) {
                 $user = new MessageUser();
                 $user->setData(array('user_id' => $member['user_id'], 'snd_rec' => "rec"));
                 $this->default_message->receivers[] = $user;
             }
         }
     }
     if (Request::get('inst_id') && $GLOBALS['perm']->have_perm('admin')) {
         $query = "SELECT user_id FROM user_inst WHERE Institut_id = ? AND inst_perms != 'user'";
         $this->default_message->receivers = DBManager::get()->fetchAll($query, array(Request::option('inst_id')), 'MessageUser::build');
     }
     if (Request::get("filter") && Request::option("course_id")) {
         $course = new Course(Request::option('course_id'));
         if ($GLOBALS['perm']->have_studip_perm("tutor", Request::option('course_id')) || $course->getSemClass()['studygroup_mode']) {
             $this->default_message->receivers = array();
             if (Request::get("filter") === 'claiming') {
                 $cs = CourseSet::getSetForCourse(Request::option("course_id"));
                 if (is_object($cs) && !$cs->hasAlgorithmRun()) {
                     foreach (AdmissionPriority::getPrioritiesByCourse($cs->getId(), Request::option("course_id")) as $user_id => $p) {
                         $this->default_message->receivers[] = MessageUser::build(array('user_id' => $user_id, 'snd_rec' => 'rec'));
                     }
                 }
             } else {
                 $params = array(Request::option('course_id'), Request::option('who'));
                 switch (Request::get("filter")) {
                     case 'send_sms_to_all':
                         $query = "SELECT b.user_id,'rec' as snd_rec FROM seminar_user a, auth_user_md5 b WHERE a.Seminar_id = ? AND a.user_id = b.user_id AND a.status = ? ORDER BY Nachname, Vorname";
                         break;
                     case 'all':
                         $query = "SELECT user_id,'rec' as snd_rec FROM seminar_user LEFT JOIN auth_user_md5 USING(user_id) WHERE Seminar_id = ? ORDER BY Nachname, Vorname";
                         break;
                     case 'prelim':
                         $query = "SELECT user_id,'rec' as snd_rec FROM admission_seminar_user LEFT JOIN auth_user_md5 USING(user_id) WHERE seminar_id = ? AND status='accepted' ORDER BY Nachname, Vorname";
                         break;
                     case 'awaiting':
                         $query = "SELECT user_id,'rec' as snd_rec FROM admission_seminar_user LEFT JOIN auth_user_md5 USING(user_id) WHERE seminar_id = ? AND status='awaiting' ORDER BY Nachname, Vorname";
                         break;
                     case 'inst_status':
                         $query = "SELECT b.user_id,'rec' as snd_rec FROM user_inst a, auth_user_md5 b WHERE a.Institut_id = ? AND a.user_id = b.user_id AND a.inst_perms = ? ORDER BY Nachname, Vorname";
                         break;
                 }
                 $this->default_message->receivers = DBManager::get()->fetchAll($query, $params, 'MessageUser::build');
             }
         }
     }
     if (Request::option('prof_id') && Request::option('deg_id') && $GLOBALS['perm']->have_perm('root')) {
         $query = "SELECT DISTINCT user_id,'rec' as snd_rec\n            FROM user_studiengang\n            WHERE studiengang_id = ? AND abschluss_id = ?";
         $this->default_message->receivers = DBManager::get()->fetchAll($query, array(Request::option('prof_id'), Request::option('deg_id')), 'MessageUser::build');
     }
     if (Request::option('sd_id') && $GLOBALS['perm']->have_perm('root')) {
         $query = "SELECT DISTINCT user_id,'rec' as snd_rec\n            FROM user_studiengang\n            WHERE abschluss_id = ?";
         $this->default_message->receivers = DBManager::get()->fetchAll($query, array(Request::option('sd_id')), 'MessageUser::build');
     }
     if (Request::option('sp_id') && $GLOBALS['perm']->have_perm('root')) {
         $query = "SELECT DISTINCT user_id,'rec' as snd_rec\n            FROM user_studiengang\n            WHERE studiengang_id = ?";
         $this->default_message->receivers = DBManager::get()->fetchAll($query, array(Request::option('sp_id')), 'MessageUser::build');
     }
     if (!$this->default_message->receivers->count() && is_array($_SESSION['sms_data']['p_rec'])) {
         $this->default_message->receivers = DBManager::get()->fetchAll("SELECT user_id,'rec' as snd_rec FROM auth_user_md5 WHERE username IN(?) ORDER BY Nachname,Vorname", array($_SESSION['sms_data']['p_rec']), 'MessageUser::build');
         unset($_SESSION['sms_data']);
     }
     if (Request::option("answer_to")) {
         $this->default_message->receivers = array();
         $old_message = new Message(Request::option("answer_to"));
         if (!$old_message->permissionToRead()) {
             throw new AccessDeniedException("Message is not for you.");
         }
         if (!Request::get('forward')) {
             if (Request::option("quote") === $old_message->getId()) {
                 if (Studip\Markup::isHtml($old_message['message'])) {
                     $this->default_message['message'] = "<div>[quote]\n" . $old_message['message'] . "\n[/quote]</div>";
                 } else {
                     $this->default_message['message'] = "[quote]\n" . $old_message['message'] . "\n[/quote]";
                 }
             }
             $this->default_message['subject'] = substr($old_message['subject'], 0, 4) === "RE: " ? $old_message['subject'] : "RE: " . $old_message['subject'];
             $user = new MessageUser();
             $user->setData(array('user_id' => $old_message['autor_id'], 'snd_rec' => "rec"));
             $this->default_message->receivers[] = $user;
             $this->answer_to = $old_message->id;
         } else {
             $messagesubject = 'FWD: ' . $old_message['subject'];
             $message = _("-_-_ Weitergeleitete Nachricht _-_-");
             $message .= "\n" . _("Betreff") . ": " . $old_message['subject'];
             $message .= "\n" . _("Datum") . ": " . strftime('%x %X', $old_message['mkdate']);
             $message .= "\n" . _("Von") . ": " . get_fullname($old_message['autor_id']);
             $num_recipients = $old_message->getNumRecipients();
             if ($GLOBALS['user']->id == $old_message->autor_id) {
                 $message .= "\n" . _("An") . ": " . ($num_recipients == 1 ? _('Eine Person') : sprintf(_('%s Personen'), $num_recipients));
             } else {
                 $message .= "\n" . _("An") . ": " . $GLOBALS['user']->getFullname() . ($num_recipients > 1 ? ' ' . sprintf(_('(und %d weitere)'), $num_recipients) : '');
             }
             $message .= "\n\n";
             if (Studip\Markup::isHtml($old_message['message'])) {
                 $message = '<div>' . htmlReady($message, false, true) . '</div>' . $old_message['message'];
             } else {
                 $message .= $old_message['message'];
             }
             if (count($old_message->attachments)) {
                 Request::set('message_id', $old_message->getNewId());
                 foreach ($old_message->attachments as $attachment) {
                     $attachment->range_id = 'provisional';
                     $attachment->seminar_id = $GLOBALS['user']->id;
                     $attachment->autor_host = $_SERVER['REMOTE_ADDR'];
                     $attachment->user_id = $GLOBALS['user']->id;
                     $attachment->description = Request::option('message_id');
                     $new_attachment = $attachment->toArray(array('range_id', 'user_id', 'seminar_id', 'name', 'description', 'filename', 'filesize'));
                     $new_attachment = StudipDocument::createWithFile(get_upload_file_path($attachment->getId()), $new_attachment);
                     $this->default_attachments[] = array('icon' => GetFileIcon(getFileExtension($new_attachment['filename']))->asImg(['class' => "text-bottom"]), 'name' => $new_attachment['filename'], 'document_id' => $new_attachment->id, 'size' => relsize($new_attachment['filesize'], false));
                 }
             }
             $this->default_message['subject'] = $messagesubject;
             $this->default_message['message'] = $message;
         }
     }
     if (Request::get("default_body")) {
         $this->default_message['message'] = Request::get("default_body");
     }
     if (Request::get("default_subject")) {
         $this->default_message['subject'] = Request::get("default_subject");
     }
     $settings = UserConfig::get($GLOBALS['user']->id)->MESSAGING_SETTINGS;
     $this->mailforwarding = Request::get('emailrequest') ? true : $settings['request_mail_forward'];
     if (trim($settings['sms_sig'])) {
         if (Studip\Markup::isHtml($this->default_message['message']) || Studip\Markup::isHtml($settings['sms_sig'])) {
             if (!Studip\Markup::isHtml($this->default_message['message'])) {
                 $this->default_message['message'] = '<div>' . nl2br($this->default_message['message']) . '</div>';
             }
             $this->default_message['message'] .= '<br><br>--<br>';
             if (Studip\Markup::isHtml($settings['sms_sig'])) {
                 $this->default_message['message'] .= $settings['sms_sig'];
             } else {
                 $this->default_message['message'] .= formatReady($settings['sms_sig']);
             }
         } else {
             $this->default_message['message'] .= "\n\n--\n" . $settings['sms_sig'];
         }
     }
     NotificationCenter::postNotification("DefaultMessageForComposerCreated", $this->default_message);
 }
Exemple #4
0
 /**
  * A person applies for a course.
  */
 function apply_action()
 {
     $user_id = $GLOBALS['user']->id;
     $courseset = CourseSet::getSetForCourse($this->course_id);
     $this->course_name = PageLayout::getTitle();
     if ($courseset) {
         $errors = $courseset->checkAdmission($user_id, $this->course_id);
         if (count($errors)) {
             $this->courseset_message = $courseset->toString(true);
             $this->admission_error = MessageBox::error(_("Die Anmeldung war nicht erfolgreich."), $errors);
             foreach ($courseset->getAdmissionRules() as $rule) {
                 $admission_form .= $rule->getInput();
             }
             if ($admission_form) {
                 $this->admission_form = $admission_form;
             }
         } else {
             if ($courseset->isSeatDistributionEnabled()) {
                 if ($courseset->hasAlgorithmRun()) {
                     if ($courseset->getSeatDistributionTime()) {
                         $msg = _("Die Plätze in dieser Veranstaltung wurden automatisch verteilt.");
                     }
                     if (StudipLock::get('enrolment' . $this->course_id)) {
                         $course = Course::find($this->course_id);
                         if ($course->getFreeSeats() && !$course->getNumWaiting()) {
                             $enrol_user = true;
                         } else {
                             if ($course->isWaitlistAvailable()) {
                                 $seminar = new Seminar($course);
                                 if ($seminar->addToWaitlist($user_id, 'last')) {
                                     $msg_details[] = sprintf(_("Alle Plätze sind belegt, Sie wurden daher auf Platz %s der Warteliste gesetzt."), $maxpos);
                                 }
                             } else {
                                 $this->admission_error = MessageBox::error(_("Die Anmeldung war nicht erfolgreich. Alle Plätze sind belegt und es steht keine Warteliste zur Verfügung."));
                             }
                         }
                     } else {
                         $this->admission_error = MessageBox::error(_("Die Anmeldung war wegen technischer Probleme nicht erfolgreich. Bitte versuchen Sie es später noch einmal."));
                     }
                 } else {
                     $msg = _("Die Plätze in dieser Veranstaltung werden automatisch verteilt.");
                     if ($limit = $courseset->getAdmissionRule('LimitedAdmission')) {
                         $msg_details[] = sprintf(_("Diese Veranstaltung gehört zu einem Anmeldeset mit %s Veranstaltungen. Sie können maximal %s davon belegen. Bei der Verteilung werden die von Ihnen gewünschten Prioritäten berücksichtigt."), count($courseset->getCourses()), $limit->getMaxNumber());
                         $this->user_max_limit = $limit->getMaxNumberForUser($user_id);
                         if (get_config('IMPORTANT_SEMNUMBER')) {
                             $order = "ORDER BY VeranstaltungsNummer, Name";
                         } else {
                             $order = "ORDER BY Name";
                         }
                         $this->priocourses = Course::findMany($courseset->getCourses(), $order);
                         $this->user_prio = AdmissionPriority::getPrioritiesByUser($courseset->getId(), $user_id);
                         $this->max_limit = $limit->getMaxNumber();
                         $this->prio_stats = AdmissionPriority::getPrioritiesStats($courseset->getId());
                         $this->already_claimed = count($this->user_prio);
                     } else {
                         $this->priocourses = Course::find($this->course_id);
                         $this->already_claimed = array_key_exists($this->course_id, AdmissionPriority::getPrioritiesByUser($courseset->getId(), $user_id));
                     }
                     $msg_details[] = _("Zeitpunkt der automatischen Verteilung: ") . strftime("%x %X", $courseset->getSeatDistributionTime());
                     $this->num_claiming = count(AdmissionPriority::getPrioritiesByCourse($courseset->getId(), $this->course_id));
                     if ($this->already_claimed) {
                         $msg_details[] = _("Sie sind bereits für die Verteilung angemeldet.");
                     }
                 }
                 $this->courseset_message = MessageBox::info($msg, $msg_details);
             } else {
                 $enrol_user = true;
             }
         }
     } else {
         $enrol_user = true;
     }
     if ($enrol_user) {
         $course = Seminar::GetInstance($this->course_id);
         if ($course->admission_prelim) {
             if (!$course->isStudygroup() && $course->admission_prelim_txt && !Request::submitted('apply')) {
                 $this->admission_prelim_txt = $course->admission_prelim_txt;
                 $this->admission_prelim_comment = Config::get()->ADMISSION_PRELIM_COMMENT_ENABLE;
                 $this->admission_form = $this->render_template_as_string('course/enrolment/prelim');
             } else {
                 if (Request::get('admission_comment')) {
                     $admission_comment = get_fullname() . ': ' . Request::get('admission_comment');
                 } else {
                     $admission_comment = '';
                 }
                 if ($course->addPreliminaryMember($user_id, $admission_comment)) {
                     if ($course->isStudygroup()) {
                         if (StudygroupModel::isInvited($user_id, $this->course_id)) {
                             // an invitation exists, so accept the join request automatically
                             $status = 'autor';
                             StudygroupModel::accept_user(get_username($user_id), $this->course_id);
                             StudygroupModel::cancelInvitation(get_username($user_id), $this->course_id);
                             $success = sprintf(_("Sie wurden in die Veranstaltung %s als %s eingetragen."), $course->getName(), get_title_for_status($status, 1));
                             PageLayout::postMessage(MessageBox::success($success));
                         } else {
                             $success = sprintf(_("Sie wurden auf die Anmeldeliste der Studiengruppe %s eingetragen. Die Moderatoren der Studiengruppe können Sie jetzt freischalten."), $course->getName());
                             PageLayout::postMessage(MessageBox::success($success));
                         }
                     } else {
                         $success = sprintf(_("Sie wurden in die Veranstaltung %s vorläufig eingetragen."), $course->getName());
                         PageLayout::postMessage(MessageBox::success($success));
                     }
                 }
             }
         } else {
             $status = 'autor';
             if ($course->addMember($user_id, $status)) {
                 $success = sprintf(_("Sie wurden in die Veranstaltung %s als %s eingetragen."), $course->getName(), get_title_for_status($status, 1));
                 PageLayout::postMessage(MessageBox::success($success));
                 $this->enrol_user = true;
                 if (StudygroupModel::isInvited($user_id, $this->course_id)) {
                     // delete an existing invitation
                     StudygroupModel::cancelInvitation(get_username($user_id), $this->course_id);
                 }
             }
         }
         unset($this->courseset_message);
     }
     StudipLock::release();
 }
Exemple #5
0
 function change_course_set_action()
 {
     CSRFProtection::verifyUnsafeRequest();
     if (Request::submitted('change_course_set_assign') && Request::get('course_set_assign') && !LockRules::Check($this->course_id, 'admission_type')) {
         $cs = new CourseSet(Request::option('course_set_assign'));
         if ($cs->isUserAllowedToAssignCourse($this->user_id, $this->course_id)) {
             CourseSet::addCourseToSet($cs->getId(), $this->course_id);
             $cs->load();
             if (in_array($this->course_id, $cs->getCourses())) {
                 PageLayout::postMessage(MessageBox::success(sprintf(_("Die Zuordnung zum Anmeldeset %s wurde durchgeführt."), htmlReady($cs->getName()))));
             }
         }
     }
     if (Request::submitted('change_course_set_unassign') && !LockRules::Check($this->course_id, 'admission_type')) {
         $this->response->add_header('X-Title', _('Anmelderegeln aufheben'));
         if ($this->course->getNumWaiting() && !Request::submitted('change_course_set_unassign_yes')) {
             $question = sprintf(_("In dieser Veranstaltung existiert eine Warteliste. Die bestehende Warteliste mit %s Einträgen wird gelöscht. Sind sie sicher?"), $this->course->getNumWaiting());
         }
         $cs = CourseSet::getSetForCourse($this->course_id);
         if ($cs) {
             $priorities = AdmissionPriority::getPrioritiesByCourse($cs->getId(), $this->course_id);
             if (count($priorities) && !Request::submitted('change_course_set_unassign_yes')) {
                 $question = sprintf(_("In dieser Veranstaltung existiert eine Anmeldeliste (Losverfahren am %s). Die bestehende Anmeldeliste mit %s Einträgen wird gelöscht. Sind sie sicher?"), strftime('%x %R', $cs->getSeatDistributionTime()), count($priorities));
             }
         }
         if (!$question && $cs) {
             CourseSet::removeCourseFromSet($cs->getId(), $this->course_id);
             $cs->load();
             if (!in_array($this->course_id, $cs->getCourses())) {
                 PageLayout::postMessage(MessageBox::success(sprintf(_("Die Zuordnung zum Anmeldeset %s wurde aufgehoben."), htmlReady($cs->getName()))));
             }
             if (!count($cs->getCourses()) && $cs->isGlobal() && $cs->getUserid() != '') {
                 $cs->delete();
             }
             if ($this->course->getNumWaiting()) {
                 $num_moved = 0;
                 foreach ($this->course->admission_applicants->findBy('status', 'awaiting') as $applicant) {
                     setTempLanguage($applicant->user_id);
                     $message_body = sprintf(_('Die Warteliste der Veranstaltung **%s** wurde deaktiviert, Sie sind damit __nicht__ zugelassen worden.'), $this->course->name);
                     $message_title = sprintf(_("Statusänderung %s"), $this->course->name);
                     messaging::sendSystemMessage($applicant->user_id, $message_title, $message_body);
                     restoreLanguage();
                     $num_moved += $applicant->delete();
                 }
                 if ($num_moved) {
                     PageLayout::postMessage(MessageBox::success(sprintf(_("%s Wartende wurden entfernt."), $num_moved)));
                 }
             }
         }
     }
     if (!$question) {
         $this->redirect($this->url_for('/index'));
     } else {
         $this->request = array('change_course_set_unassign' => 1);
         $this->button_yes = 'change_course_set_unassign_yes';
         PageLayout::postMessage(MessageBox::info($question));
         $this->render_template('course/admission/_change_admission.php');
     }
 }
Exemple #6
0
 function get_courses($seminare_condition)
 {
     global $perm, $user;
     list($institut_id, $all) = explode('_', $this->current_institut_id);
     // Prepare count statements
     $query = "SELECT count(*)\n                  FROM seminar_user\n                  WHERE seminar_id = ? AND status IN ('user', 'autor')";
     $count0_statement = DBManager::get()->prepare($query);
     $query = "SELECT SUM(status = 'accepted') AS count2,\n                     SUM(status = 'awaiting') AS count3\n                  FROM admission_seminar_user\n                  WHERE seminar_id = ?\n                  GROUP BY seminar_id";
     $count1_statement = DBManager::get()->prepare($query);
     $parameters = array();
     $sql = "SELECT seminare.seminar_id,seminare.Name as course_name,seminare.VeranstaltungsNummer as course_number,\n                admission_prelim, admission_turnout,seminar_courseset.set_id\n                FROM seminar_courseset\n                INNER JOIN courseset_rule csr ON csr.set_id=seminar_courseset.set_id AND csr.type='ParticipantRestrictedAdmission'\n                INNER JOIN seminare ON seminar_courseset.seminar_id=seminare.seminar_id\n                ";
     if ($institut_id == 'all' && $perm->have_perm('root')) {
         $sql .= "WHERE 1 {$seminare_condition} ";
     } elseif ($all == 'all') {
         $sql .= "INNER JOIN Institute USING (Institut_id)\n                    WHERE Institute.fakultaets_id = ? {$seminare_condition}\n                    ";
         $parameters[] = $institut_id;
     } else {
         $sql .= "WHERE seminare.Institut_id = ? {$seminare_condition}\n                    ";
         $parameters[] = $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 = array();
     $ret = array();
     while ($row = $statement->fetch(PDO::FETCH_ASSOC)) {
         $seminar_id = $row['seminar_id'];
         $ret[$seminar_id] = $row;
         $count0_statement->execute(array($seminar_id));
         $count = $count0_statement->fetchColumn();
         $ret[$seminar_id]['count_teilnehmer'] = $count;
         $count1_statement->execute(array($seminar_id));
         $counts = $count1_statement->fetch(PDO::FETCH_ASSOC);
         $ret[$seminar_id]['count_prelim'] = (int) $counts['count2'];
         $ret[$seminar_id]['count_waiting'] = (int) $counts['count3'];
         if (!$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;
 }
Exemple #7
0
 /**
  * @param string $sort_status
  * @param string $order_by
  * @return SimpleCollection
  */
 function getAdmissionMembers($sort_status = 'autor', $order_by = 'nachname asc')
 {
     $cs = CourseSet::getSetForCourse($this->course_id);
     $claiming = array();
     if (is_object($cs) && !$cs->hasAlgorithmRun()) {
         foreach (AdmissionPriority::getPrioritiesByCourse($cs->getId(), $this->course_id) as $user_id => $p) {
             $user = User::find($user_id);
             $data = $user->toArray('user_id username vorname nachname email');
             $data['fullname'] = $user->getFullname('full_rev');
             $data['position'] = $p;
             $data['visible'] = 'unknown';
             $data['status'] = 'claiming';
             $claiming[] = $data;
         }
     }
     $query = "SELECT asu.user_id,username,vorname,nachname,email,status,position,asu.mkdate,asu.visible, asu.comment,\n                " . $GLOBALS['_fullname_sql']['full_rev'] . " as fullname\n                FROM admission_seminar_user asu INNER JOIN auth_user_md5 USING(user_id)\n                INNER JOIN user_info USING(user_id)\n                WHERE seminar_id = ? ORDER BY position, nachname ASC";
     $st = DBManager::get()->prepare($query);
     $st->execute(array($this->course_id));
     $application_members = SimpleCollection::createFromArray(array_merge($claiming, $st->fetchAll(PDO::FETCH_ASSOC)));
     $filtered_members = array();
     foreach (words('awaiting accepted claiming') as $status) {
         $filtered_members[$status] = $application_members->findBy('status', $status);
         if ($status == $sort_status) {
             $filtered_members[$status]->orderBy($order_by, strpos($order_by, 'nachname') === false ? SORT_NUMERIC : SORT_LOCALE_STRING);
         }
     }
     return $filtered_members;
 }
Exemple #8
0
 public static function getWaitingList($user_id)
 {
     $claiming = DBManager::get()->fetchAll("SELECT set_id, priorities.seminar_id,'claiming' as status, seminare.Name, seminare.Ort\n            FROM priorities\n            INNER JOIN seminare USING(seminar_id)\n            WHERE user_id = ?", array($user_id));
     $csets = array();
     foreach ($claiming as $k => $claim) {
         if (!$csets[$claim['set_id']]) {
             $csets[$claim['set_id']] = new CourseSet($claim['set_id']);
         }
         $cs = $csets[$claim['set_id']];
         if (!$cs->hasAlgorithmRun()) {
             $claiming[$k]['admission_endtime'] = $cs->getSeatDistributionTime();
             $num_claiming = count(AdmissionPriority::getPrioritiesByCourse($claim['set_id'], $claim['seminar_id']));
             $free = Course::find($claim['seminar_id'])->getFreeSeats();
             if ($free <= 0) {
                 $claiming[$k]['admission_chance'] = 0;
             } else {
                 if ($free >= $num_claiming) {
                     $claiming[$k]['admission_chance'] = 100;
                 } else {
                     $claiming[$k]['admission_chance'] = round($free / $num_claiming * 100);
                 }
             }
         } else {
             unset($claiming[$k]);
         }
     }
     $stmt = DBManager::get()->prepare("SELECT admission_seminar_user.*, seminare.status as sem_status, " . "seminare.Name, seminare.Ort " . "FROM admission_seminar_user " . "INNER JOIN seminare USING(seminar_id) " . "WHERE user_id = ? " . "ORDER BY admission_seminar_user.status, name");
     $stmt->execute(array($user_id));
     $waitlists = array_merge($claiming, $stmt->fetchAll());
     return $waitlists;
 }