public function add()
 {
     if (!$this->permissions['subscribe_course']) {
         $this->render('invalid', array('message' => $this->_getErrorMessage('no permission'), 'back_url' => 'index.php?r=' . $this->link_course . '/show'));
         return;
     } else {
         if (!$this->checkAdminLimit()) {
             $this->render('invalid', array('message' => Lang::t('_SUBSCRIBE_LIMIT_REACHED', 'subscribe'), 'back_url' => 'index.php?r=' . $this->link_course . '/show'));
             return;
         }
     }
     require_once _base_ . '/lib/lib.form.php';
     require_once _base_ . '/lib/lib.userselector.php';
     //require_once($GLOBALS['where_framework'].'/class.module/class.directory.php');
     $user_selector = new UserSelector();
     $cman = new CourseAlms();
     //Course info
     $id_course = Get::req('id_course', DOTY_INT, 0);
     $id_edition = Get::req('id_edition', DOTY_INT, 0);
     $id_date = Get::req('id_date', DOTY_INT, 0);
     if (isset($_POST['cancelselector'])) {
         Util::jump_to('index.php?r=' . $this->link . '/show&id_course=' . $id_course . '&id_edition=' . $id_edition . '&id_date=' . $id_date);
     }
     $model = new SubscriptionAlms($id_course, $id_edition, $id_date);
     if (isset($_POST['okselector'])) {
         $_selection = $user_selector->getSelection($_POST);
         $acl_man = Docebo::user()->getAclManager();
         $user_selected = $acl_man->getAllUsersFromSelection($_selection);
         //$acl_man->getAllUsersFromIdst($_selection);
         $user_alredy_subscribed = $model->loadUserSelectorSelection();
         $user_selected = array_diff($user_selected, $user_alredy_subscribed);
         if (Docebo::user()->getUserLevelId() != ADMIN_GROUP_GODADMIN) {
             $to_subscribe = count($user_selected);
             $admin_pref = new AdminPreference();
             $pref = $admin_pref->getAdminRules(Docebo::user()->getIdSt());
             if ($pref['admin_rules.limit_course_subscribe'] == 'on') {
                 $user_pref = new UserPreferences(Docebo::user()->getIdSt());
                 $subscribed_count = $user_pref->getPreference('user_subscribed_count');
                 if ($subscribed_count + $to_subscribe > $pref['admin_rules.max_course_subscribe']) {
                     $this->render('invalid', array('message' => Lang::t('_SUBSCRIBE_LIMIT_REACHED', 'subscribe'), 'back_url' => 'index.php?r=' . $this->link_course . '/show'));
                     return;
                 }
             }
         }
         if (Docebo::user()->getUserLevelId() != ADMIN_GROUP_GODADMIN) {
             require_once _base_ . '/lib/lib.preference.php';
             $adminManager = new AdminPreference();
             $admin_users = $adminManager->getAdminUsers(Docebo::user()->getIdST());
             $user_selected = array_intersect($user_selected, $admin_users);
         }
         $user_selected = $acl_man->getUsersFromMixedIdst($user_selected);
         if (count($user_selected) == 0) {
             Util::jump_to('index.php?r=' . $this->link . '/add&id_course=' . $id_course . '&id_edition=' . $id_edition . '&id_date=' . $id_date . '&err=_empty_selection');
         }
         $sel_date_begin_validity = Get::req('sel_date_begin_validity', DOTY_INT, 0) > 0;
         $sel_date_expire_validity = Get::req('sel_date_expire_validity', DOTY_INT, 0) > 0;
         $date_begin_validity = $sel_date_begin_validity ? Get::req('set_date_begin_validity', DOTY_STRING, "") : false;
         $date_expire_validity = $sel_date_expire_validity ? Get::req('set_date_expire_validity', DOTY_STRING, "") : false;
         if ($date_begin_validity) {
             $date_begin_validity = Format::dateDb($date_begin_validity, 'date');
         }
         if ($date_expire_validity) {
             $date_expire_validity = Format::dateDb($date_expire_validity, 'date');
         }
         $select_level_mode = Get::req('select_level_mode', DOTY_STRING, "");
         switch ($select_level_mode) {
             case "students":
                 // subscribe the selection with the students level
                 require_once _lms_ . '/lib/lib.course.php';
                 $course_info = $model->getCourseInfoForSubscription();
                 //check if the subscriber is a sub admin and, if true check it's limitation
                 $can_subscribe = true;
                 $subscribe_method = $course_info['subscribe_method'];
                 if (Docebo::user()->getUserLevelId() != ADMIN_GROUP_GODADMIN) {
                     $limited_subscribe = Docebo::user()->preference->getAdminPreference('admin_rules.limit_course_subscribe');
                     $max_subscribe = Docebo::user()->preference->getAdminPreference('admin_rules.max_course_subscribe');
                     $direct_subscribe = Docebo::user()->preference->getAdminPreference('admin_rules.direct_course_subscribe');
                     if ($limited_subscribe == 'on') {
                         $limited_subscribe = true;
                     } else {
                         $limited_subscribe = false;
                     }
                     if ($direct_subscribe == 'on') {
                         $direct_subscribe = true;
                     } else {
                         $direct_subscribe = false;
                     }
                 } else {
                     $limited_subscribe = false;
                     $max_subscribe = 0;
                     $direct_subscribe = true;
                 }
                 if ($can_subscribe) {
                     require_once _lms_ . '/lib/lib.course.php';
                     $docebo_course = new DoceboCourse($id_course);
                     $level_idst =& $docebo_course->getCourseLevel($id_course);
                     if (count($level_idst) == 0 || $level_idst[1] == '') {
                         $level_idst =& $docebo_course->createCourseLevel($id_course);
                     }
                     $waiting = 0;
                     $user_subscribed = array();
                     $user_waiting = array();
                     if (!$direct_subscribe) {
                         $waiting = 1;
                     }
                     // do the subscriptions
                     $result = true;
                     $this->db->start_transaction();
                     while (list(, $id_user) = each($user_selected)) {
                         if (!$limited_subscribe || $max_subscribe) {
                             //$this->acl_man->addToGroup($level_idst[3], $id_user);
                             $this->_addToCourseGroup($level_idst[3], $id_user);
                             if ($model->subscribeUser($id_user, 3, $waiting, $date_begin_validity, $date_expire_validity)) {
                                 $max_subscribe--;
                             } else {
                                 $this->acl_man->removeFromGroup($level_idst[3], $id_user);
                                 $result = false;
                             }
                         }
                     }
                     //End While
                     $this->db->commit();
                     // Save limit preference for admin
                     if (Docebo::user()->getUserLevelId() != ADMIN_GROUP_GODADMIN) {
                         $to_subscribe = count($user_selected);
                         if ($pref['admin_rules.limit_course_subscribe'] == 'on') {
                             $user_pref->setPreference('user_subscribed_count', $subscribed_count + $to_subscribe);
                         }
                     }
                     reset($user_selected);
                     $send_alert = Get::req('send_alert', DOTY_INT, 0);
                     //basically we will consider the alert as a checkbox, the initial state of the checkbox will be setted according to the alert status
                     if (!empty($user_selected) && $send_alert) {
                         require_once _base_ . '/lib/lib.eventmanager.php';
                         $array_subst = array('[url]' => Get::sett('url'), '[course]' => $course_info['name'], '[medium_time]' => $course_info['mediumTime'], '[course_name]' => $course_info['name'], '[course_code]' => $course['code']);
                         // message to user that is waiting
                         $msg_composer = new EventMessageComposer();
                         $msg_composer->setSubjectLangText('email', '_NEW_USER_SUBSCRIBED_SUBJECT', false);
                         $msg_composer->setBodyLangText('email', '_NEW_USER_SUBSCRIBED_TEXT', $array_subst);
                         $msg_composer->setBodyLangText('sms', '_NEW_USER_SUBSCRIBED_TEXT_SMS', $array_subst);
                         // send message to the user subscribed
                         createNewAlert('UserCourseInserted', 'subscribe', 'insert', '1', 'User subscribed', $user_selected, $msg_composer, $send_alert, true);
                     }
                 }
                 $result = $result > 0 ? '_operation_successful' : '_operation_failed';
                 Util::jump_to('index.php?r=' . $this->link . '/show&id_course=' . $id_course . '&id_edition=' . $id_edition . '&id_date=' . $id_date . '&res=' . $result);
                 break;
         }
         $model->loadSelectedUser($user_selected);
         $course_info = $this->model->getCourseInfoForSubscription();
         $course_name = ($course_info['code'] !== '' ? '[' . $course_info['code'] . '] ' : '') . $course_info['name'];
         $this->render('level', array('id_course' => $id_course, 'id_edition' => $id_edition, 'id_date' => $id_date, 'model' => $model, 'course_info' => $cman->getInfo($id_course, $id_edition, $id_date), 'num_subscribed' => count($user_selected), 'send_alert' => Get::req('send_alert', DOTY_INT, 0), 'date_begin_validity' => $date_begin_validity, 'date_expire_validity' => $date_expire_validity, 'course_name' => $course_name));
     } else {
         if (isset($_GET['err']) && $_GET['err'] !== '') {
             UIFeedback::error(Lang::t(strtoupper($_GET['err']), 'subscription'));
         }
         $user_selector->show_user_selector = TRUE;
         $user_selector->show_group_selector = TRUE;
         $user_selector->show_orgchart_selector = TRUE;
         $user_selector->show_orgchart_simple_selector = TRUE;
         $user_alredy_subscribed = array();
         if (isset($_GET['load'])) {
             $user_selector->requested_tab = PEOPLEVIEW_TAB;
             $user_alredy_subscribed = $model->loadUserSelectorSelection();
             $user_selector->resetSelection($user_alredy_subscribed);
         }
         //find if the event manager is configured to send an alert or not in case of new subscription
         list($send_alert) = sql_fetch_row(sql_query("SELECT permission " . " FROM %adm_event_class as ec" . " JOIN %adm_event_manager as em" . " WHERE ec.idClass = em.idClass AND ec.class = 'UserCourseInserted' "));
         $course_info = $this->model->getCourseInfoForSubscription();
         $course_name = ($course_info['code'] !== '' ? '[' . $course_info['code'] . '] ' : '') . $course_info['name'];
         $this->render('add', array('id_course' => $id_course, 'id_edition' => $id_edition, 'id_date' => $id_date, 'model' => $model, 'course_info' => $cman->getInfo($id_course, $id_edition, $id_date), 'user_selector' => $user_selector, 'user_alredy_subscribed' => $user_alredy_subscribed, 'send_alert' => $send_alert == 'mandatory', 'course_name' => $course_name));
     }
 }