Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php

1007 lines
38 KiB

<?php
/* For licensing terms, see /license.txt */
/**
* This class is used to add an advanced subscription allowing the admin to
* create user queues requesting a subscribe to a session
* @package chamilo.plugin.advanced_subscription
*/
class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface
{
protected $strings;
/**
* Constructor
*/
function __construct()
{
$parameters = array(
'yearly_cost_limit' => 'text',
'yearly_hours_limit' => 'text',
'yearly_cost_unit_converter' => 'text',
'courses_count_limit' => 'text',
'course_session_credit_year_start_date' => 'text',
'ws_url' => 'text',
'min_profile_percentage' => 'text',
'check_induction' => 'boolean',
'secret_key' => 'text',
);
parent::__construct('1.0', 'Imanol Losada, Daniel Barreto', $parameters);
}
/**
* Instance the plugin
* @staticvar null $result
* @return AdvancedSubscriptionPlugin
*/
static function create()
{
static $result = null;
return $result ? $result : $result = new self();
}
/**
* Install the plugin
* @return void
*/
public function install()
{
$this->installDatabase();
$this->installHook();
}
/**
* Uninstall the plugin
* @return void
*/
public function uninstall()
{
$this->uninstallHook();
$this->uninstallDatabase();
}
/**
* Create the database tables for the plugin
* @return void
*/
private function installDatabase()
{
$advancedSubscriptionQueueTable = Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE);
$sql = "CREATE TABLE IF NOT EXISTS $advancedSubscriptionQueueTable (" .
"id int UNSIGNED NOT NULL AUTO_INCREMENT, " .
"session_id int UNSIGNED NOT NULL, " .
"user_id int UNSIGNED NOT NULL, " .
"status int UNSIGNED NOT NULL, " .
"last_message_id int UNSIGNED NOT NULL, " .
"created_at datetime NOT NULL, " .
"updated_at datetime NULL, " .
"PRIMARY KEY PK_advanced_subscription_queue (id), " .
"UNIQUE KEY UK_advanced_subscription_queue (user_id, session_id)); ";
Database::query($sql);
}
/**
* Drop the database tables for the plugin
* @return void
*/
private function uninstallDatabase()
{
/* Drop plugin tables */
$advancedSubscriptionQueueTable = Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE);
$sql = "DROP TABLE IF EXISTS $advancedSubscriptionQueueTable; ";
Database::query($sql);
/* Delete settings */
$settingsTable = Database::get_main_table(TABLE_MAIN_SETTINGS_CURRENT);
Database::query("DELETE FROM $settingsTable WHERE subkey = 'advanced_subscription'");
}
/**
* Return true if user is allowed to be added to queue for session subscription
* @param int $userId
* @param array $params MUST have keys:
* "is_connected" Indicate if the user is online on external web
* "profile_completed" Percentage of completed profile, given by WS
* @throws Exception
* @return bool
*/
public function isAllowedToDoRequest($userId, $params = array())
{
$isAllowed = false;
if (isset($params['is_connected']) && isset($params['profile_completed'])) {
$plugin = self::create();
// WS URL is not yet implemented
// $wsUrl = $plugin->get('ws_url');
// @TODO: Get connection status from user by WS
$isConnected = $params['is_connected'];
if ($isConnected) {
$profileCompletedMin = (float) $plugin->get('min_profile_percentage');
// @TODO: Get completed profile percentage by WS
$profileCompleted = (float) $params['profile_completed'];
if ($profileCompleted > $profileCompletedMin) {
$checkInduction = $plugin->get('check_induction');
// @TODO: check if user have completed at least one induction session
$completedInduction = true;
if (!$checkInduction || $completedInduction) {
$uitMax = $plugin->get('yearly_cost_unit_converter');
$uitMax *= $plugin->get('yearly_cost_limit');
$uitUser = 0;
$now = new DateTime(api_get_utc_datetime());
$newYearDate = $plugin->get('course_session_credit_year_start_date');
$newYearDate = !empty($newYearDate) ?
new \DateTime($newYearDate . $now->format('/Y')) :
$now;
$extra = new ExtraFieldValue('session');
$joinSessionTable = Database::get_main_table(TABLE_MAIN_SESSION_USER) . ' su INNER JOIN ' .
Database::get_main_table(TABLE_MAIN_SESSION) . ' s ON s.id = su.id_session';
$whereSessionParams = 'su.relation_type = ? AND s.date_start >= ? AND su.id_user = ?';
$whereSessionParamsValues = array(
0,
$newYearDate->format('Y-m-d'),
$userId
);
$whereSession = array(
'where' => array(
$whereSessionParams => $whereSessionParamsValues
)
);
$selectSession = 's.id AS id';
$sessions = Database::select(
$selectSession,
$joinSessionTable,
$whereSession
);
if (is_array($sessions) && count($sessions) > 0) {
foreach ($sessions as $session) {
$var = $extra->get_values_by_handler_and_field_variable($session['id'], 'cost');
$uitUser += $var['field_value'];
}
}
if ($uitMax >= $uitUser) {
$expendedTimeMax = $plugin->get('yearly_hours_limit');
$expendedTime = 0;
if (is_array($sessions) && count($sessions) > 0) {
foreach ($sessions as $session) {
$var = $extra->get_values_by_handler_and_field_variable($session['id'], 'teaching_hours');
$expendedTime += $var['field_value'];
}
}
if ($expendedTimeMax >= $expendedTime) {
$expendedNumMax = $plugin->get('courses_count_limit');
$expendedNum = count($sessions);
if ($expendedNumMax >= $expendedNum) {
$isAllowed = true;
} else {
throw new \Exception($this->get_lang('AdvancedSubscriptionCourseXLimitReached'));
}
} else {
throw new \Exception($this->get_lang('AdvancedSubscriptionTimeXLimitReached'));
}
} else {
throw new \Exception($this->get_lang('AdvancedSubscriptionCostXLimitReached'));
}
} else {
throw new \Exception($this->get_lang('AdvancedSubscriptionIncompleteInduction'));
}
} else {
throw new \Exception($this->get_lang('AdvancedSubscriptionProfileIncomplete'));
}
} else {
throw new \Exception($this->get_lang('AdvancedSubscriptionNotConnected'));
}
return $isAllowed;
} else {
throw new \Exception($this->get_lang('AdvancedSubscriptionIncompleteParams'));
}
}
/**
* Register a user into a queue for a session
* @param $userId
* @param $sessionId
* @return bool|int
*/
public function addToQueue($userId, $sessionId)
{
// Filter input variables
$userId = intval($userId);
$sessionId = intval($sessionId);
$now = api_get_utc_datetime();
$advancedSubscriptionQueueTable = Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE);
$attributes = array(
'session_id' => $sessionId,
'user_id' => $userId,
'status' => 0,
'created_at' => $now,
'updated_at' => null,
);
$id = Database::insert($advancedSubscriptionQueueTable, $attributes);
return $id;
}
/**
* Register message with type and status
* @param $mailId
* @param $userId
* @param $sessionId
* @return bool|int
*/
public function saveLastMessage($mailId, $userId, $sessionId)
{
// Filter variables
$mailId = intval($mailId);
$userId = intval($userId);
$sessionId = intval($sessionId);
$queueTable = Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE);
$attributes = array(
'last_message_id' => $mailId,
);
$num = Database::update(
$queueTable,
$attributes,
array('user_id = ? AND session_id = ?' => array($userId, $sessionId))
);
return $num;
}
/**
* Check for requirements and register user into queue
* @param $userId
* @param $sessionId
* @param $params
* @return bool|string
*/
public function startSubscription($userId, $sessionId, $params)
{
$result = false;
if (!empty($sessionId) && !empty($userId)) {
$plugin = self::create();
try {
if ($plugin->isAllowedToDoRequest($userId, $params)) {
$result = (bool) $plugin->addToQueue($userId, $sessionId);
} else {
throw new \Exception($this->get_lang('AdvancedSubscriptionNotMoreAble'));
}
} catch (Exception $e) {
$result = $e->getMessage();
}
} else {
$result = 'Params not found';
}
return $result;
}
/**
* Send message for the student subscription approval to a specific session
* @param int|array $studentId
* @param int $receiverId
* @param string $subject
* @param string $content
* @param int $sessionId
* @param bool $save
* @return bool|int
*/
public function sendMailMessage($studentId, $receiverId, $subject, $content, $sessionId, $save = false)
{
$mailId = MessageManager::send_message(
$receiverId,
$subject,
$content
);
if ($save && !empty($mailId)) {
// Save as sent message
if (is_array($studentId) && !empty($studentId)) {
foreach ($studentId as $student) {
$this->saveLastMessage($mailId, $student['user_id'], $sessionId);
}
} else {
$studentId = intval($studentId);
$this->saveLastMessage($mailId, $studentId, $sessionId);
}
}
return $mailId;
}
/**
* Check if session is open for subscription
* @param $sessionId
* @param string $fieldVariable
* @return bool
*/
public function isSessionOpen($sessionId, $fieldVariable = 'is_open_session')
{
$sessionId = (int) $sessionId;
$fieldVariable = Database::escape_string($fieldVariable);
$isOpen = false;
if ($sessionId > 0 && !empty($fieldVariable)) {
$sfTable = Database::get_main_table(TABLE_MAIN_SESSION_FIELD);
$sfvTable = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES);
$joinTable = $sfvTable . ' sfv INNER JOIN ' . $sfTable . ' sf ON sfv.field_id = sf.id ';
$row = Database::select(
'sfv.field_value as field_value',
$joinTable,
array(
'where' => array(
'sfv.session_id = ? AND sf.field_variable = ?' => array($sessionId, $fieldVariable),
)
)
);
if (isset($row[0]) && is_array($row[0])) {
$isOpen = (bool) $row[0]['field_value'];
}
}
return $isOpen;
}
/**
* Update the queue status for subscription approval rejected or accepted
* @param $params
* @param $newStatus
* @return bool
*/
public function updateQueueStatus($params, $newStatus)
{
$newStatus = intval($newStatus);
if (isset($params['queue']['id'])) {
$where = array(
'id = ?' => intval($params['queue']['id']),
);
} elseif(isset($params['studentUserId']) && isset($params['sessionId'])) {
$where = array(
'user_id = ? AND session_id = ? AND status <> ? AND status <> ?' => array(
intval($params['studentUserId']),
intval($params['sessionId']),
$newStatus,
ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED,
),
);
}
if (isset($where)) {
$res = (bool) Database::update(
Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE),
array(
'status' => $newStatus,
'updated_at' => api_get_utc_datetime(),
),
$where
);
} else {
$res = false;
}
return $res;
}
/**
* Render and send mail by defined advanced subscription action
* @param $data
* @param $actionType
* @return array
*/
public function sendMail($data, $actionType)
{
$template = new Template($this->get_lang('plugin_title'));
$template->assign('data', $data);
$templateParams = array(
'user',
'student',
'students',
'superior',
'admins',
'session',
'signature',
'admin_view_url',
'acceptUrl',
'rejectUrl'
);
foreach ($templateParams as $templateParam) {
$template->assign($templateParam, $data[$templateParam]);
}
$mailIds = array();
switch ($actionType) {
case ADVANCED_SUBSCRIPTION_ACTION_STUDENT_REQUEST:
// Mail to student
$mailIds['render'] = $this->sendMailMessage(
$data['studentUserId'],
$data['student']['user_id'],
$this->get_lang('MailStudentRequest'),
$template->fetch('/advanced_subscription/views/student_notice_student.tpl'),
$data['sessionId']
);
// Mail to superior
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$data['superior']['user_id'],
$this->get_lang('MailStudentRequest'),
$template->fetch('/advanced_subscription/views/student_notice_superior.tpl'),
$data['sessionId'],
true
);
break;
case ADVANCED_SUBSCRIPTION_ACTION_SUPERIOR_APPROVE:
// Mail to student
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$data['student']['user_id'],
$this->get_lang('MailBossAccept'),
$template->fetch('/advanced_subscription/views/superior_accepted_notice_student.tpl'),
$data['sessionId']
);
// Mail to superior
$mailIds['render'] = $this->sendMailMessage(
$data['studentUserId'],
$data['superior']['user_id'],
$this->get_lang('MailBossAccept'),
$template->fetch('/advanced_subscription/views/superior_accepted_notice_superior.tpl'),
$data['sessionId']
);
// Mail to admin
foreach ($data['admins'] as $adminId => $admin) {
$template->assign('admin', $admin);
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$adminId,
$this->get_lang('MailBossAccept'),
$template->fetch('/advanced_subscription/views/superior_accepted_notice_admin.tpl'),
$data['sessionId'],
true
);
}
break;
case ADVANCED_SUBSCRIPTION_ACTION_SUPERIOR_DISAPPROVE:
// Mail to student
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$data['student']['user_id'],
$this->get_lang('MailBossReject'),
$template->fetch('/advanced_subscription/views/superior_rejected_notice_student.tpl'),
$data['sessionId'],
true
);
// Mail to superior
$mailIds['render'] = $this->sendMailMessage(
$data['studentUserId'],
$data['superior']['user_id'],
$this->get_lang('MailBossReject'),
$template->fetch('/advanced_subscription/views/superior_rejected_notice_superior.tpl'),
$data['sessionId']
);
break;
case ADVANCED_SUBSCRIPTION_ACTION_SUPERIOR_SELECT:
// Mail to student
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$data['student']['user_id'],
$this->get_lang('MailStudentRequestSelect'),
$template->fetch('/advanced_subscription/views/student_notice_student.tpl'),
$data['sessionId']
);
// Mail to superior
$mailIds['render'] = $this->sendMailMessage(
$data['studentUserId'],
$data['superior']['user_id'],
$this->get_lang('MailStudentRequestSelect'),
$template->fetch('/advanced_subscription/views/student_notice_superior.tpl'),
$data['sessionId'],
true
);
break;
case ADVANCED_SUBSCRIPTION_ACTION_ADMIN_APPROVE:
// Mail to student
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$data['student']['user_id'],
$this->get_lang('MailAdminAccept'),
$template->fetch('/advanced_subscription/views/admin_accepted_notice_student.tpl'),
$data['sessionId']
);
// Mail to superior
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$data['superior']['user_id'],
$this->get_lang('MailAdminAccept'),
$template->fetch('/advanced_subscription/views/admin_accepted_notice_superior.tpl'),
$data['sessionId']
);
// Mail to admin
$adminId = $data['currentUserId'];
$template->assign('admin', $data['admins'][$adminId]);
$mailIds['render'] = $this->sendMailMessage(
$data['studentUserId'],
$adminId,
$this->get_lang('MailAdminAccept'),
$template->fetch('/advanced_subscription/views/admin_accepted_notice_admin.tpl'),
$data['sessionId'],
true
);
break;
case ADVANCED_SUBSCRIPTION_ACTION_ADMIN_DISAPPROVE:
// Mail to student
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$data['student']['user_id'],
$this->get_lang('MailAdminReject'),
$template->fetch('/advanced_subscription/views/admin_rejected_notice_student.tpl'),
$data['sessionId'],
true
);
// Mail to superior
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$data['superior']['user_id'],
$this->get_lang('MailAdminReject'),
$template->fetch('/advanced_subscription/views/admin_rejected_notice_superior.tpl'),
$data['sessionId']
);
// Mail to admin
$adminId = $data['currentUserId'];
$template->assign('admin', $data['admins'][$adminId]);
$mailIds['render'] = $this->sendMailMessage(
$data['studentUserId'],
$adminId,
$this->get_lang('MailAdminReject'),
$template->fetch('/advanced_subscription/views/admin_rejected_notice_admin.tpl'),
$data['sessionId']
);
break;
case ADVANCED_SUBSCRIPTION_ACTION_STUDENT_REQUEST_NO_BOSS:
// Mail to student
$mailIds['render'] = $this->sendMailMessage(
$data['studentUserId'],
$data['student']['user_id'],
$this->get_lang('MailStudentRequestNoBoss'),
$template->fetch('/advanced_subscription/views/student_no_superior_notice_student.tpl'),
$data['sessionId']
);
// Mail to admin
foreach ($data['admins'] as $adminId => $admin) {
$template->assign('admin', $admin);
$mailIds[] = $this->sendMailMessage(
$data['studentUserId'],
$adminId,
$this->get_lang('MailStudentRequestNoBoss'),
$template->fetch('/advanced_subscription/views/student_no_superior_notice_admin.tpl'),
$data['sessionId'],
true
);
}
break;
case ADVANCED_SUBSCRIPTION_ACTION_REMINDER_STUDENT:
$mailIds['render'] = $this->sendMailMessage(
$data['student']['user_id'],
$data['student']['user_id'],
$this->get_lang('MailRemindStudent'),
$template->fetch('/advanced_subscription/views/reminder_notice_student.tpl'),
$data['sessionId'],
true
);
break;
case ADVANCED_SUBSCRIPTION_ACTION_REMINDER_SUPERIOR:
$mailIds['render'] = $this->sendMailMessage(
$data['students'],
$data['superior']['user_id'],
$this->get_lang('MailRemindSuperior'),
$template->fetch('/advanced_subscription/views/reminder_notice_superior.tpl'),
$data['sessionId'],
true
);
break;
case ADVANCED_SUBSCRIPTION_ACTION_REMINDER_SUPERIOR_MAX:
$mailIds['render'] = $this->sendMailMessage(
$data['students'],
$data['superior']['user_id'],
$this->get_lang('MailRemindSuperior'),
$template->fetch('/advanced_subscription/views/reminder_notice_superior_max.tpl'),
$data['sessionId'],
true
);
break;
case ADVANCED_SUBSCRIPTION_ACTION_REMINDER_ADMIN:
// Mail to admin
foreach ($data['admins'] as $adminId => $admin) {
$template->assign('admin', $admin);
$mailIds[] = $this->sendMailMessage(
$data['students'],
$adminId,
$this->get_lang('MailRemindAdmin'),
$template->fetch('/advanced_subscription/views/student_no_superior_notice_admin.tpl'),
$data['sessionId'],
true
);
}
break;
default:
break;
}
return $mailIds;
}
/**
* Count the users in queue filtered by params (sessions, status)
* @param array $params Input array containing the set of
* session and status to count from queue
* e.g:
* array('sessions' => array(215, 218, 345, 502),
* 'status' => array(0, 1, 2))
* @return int
*/
public function countQueueByParams($params)
{
$count = 0;
if (!empty($params) && is_array($params)) {
$advancedSubscriptionQueueTable = Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE);
$where['1 = ? '] = 1;
if (isset($params['sessions']) && is_array($params['sessions'])) {
foreach ($params['sessions'] as &$sessionId) {
$sessionId = intval($sessionId);
}
$where['AND session_id IN ( ? ) '] = implode($params['sessions']);
}
if (isset($params['status']) && is_array($params['status'])) {
foreach ($params['status'] as &$status) {
$status = intval($status);
}
$where['AND status IN ( ? ) '] = implode($params['status']);
}
$where['where'] = $where;
$count = Database::select('COUNT(*)', $advancedSubscriptionQueueTable, $where);
$count = $count[0]['COUNT(*)'];
}
return $count;
}
/**
* This method will call the Hook management insertHook to add Hook observer from this plugin
* @return int
*/
public function installHook()
{
$hookObserver = HookAdvancedSubscription::create();
HookAdminBlock::create()->attach($hookObserver);
HookWSRegistration::create()->attach($hookObserver);
HookNotificationContent::create()->attach($hookObserver);
HookNotificationTitle::create()->attach($hookObserver);
}
/**
* This method will call the Hook management deleteHook to disable Hook observer from this plugin
* @return int
*/
public function uninstallHook()
{
$hookObserver = HookAdvancedSubscription::create();
HookAdminBlock::create()->detach($hookObserver);
HookWSRegistration::create()->detach($hookObserver);
HookNotificationContent::create()->detach($hookObserver);
HookNotificationTitle::create()->detach($hookObserver);
}
/**
* Return the status from user in queue to session subscription
* @param int $userId
* @param int $sessionId
* @return bool|int
*/
public function getQueueStatus($userId, $sessionId)
{
$userId = intval($userId);
$sessionId = intval($sessionId);
if (!empty($userId) && !empty($sessionId)) {
$queueTable = Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE);
$row = Database::select(
'status',
$queueTable,
array(
'where' => array(
'user_id = ? AND session_id = ?' => array($userId, $sessionId),
)
)
);
if (count($row) == 1) {
return $row[0]['status'];
} else {
return ADVANCED_SUBSCRIPTION_QUEUE_STATUS_NO_QUEUE;
}
}
return false;
}
/**
* Return the remaining vacancy
* @param $sessionId
* @return bool|int
*/
public function getVacancy($sessionId)
{
if (!empty($sessionId)) {
$extra = new ExtraFieldValue('session');
$var = $extra->get_values_by_handler_and_field_variable($sessionId, 'vacancies');
$vacancy = intval($var['field_value']);
if (!empty($vacancy)) {
$vacancy -= $this->countQueueByParams(
array(
'sessions' => array($sessionId),
'status' => array(ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED),
)
);
if ($vacancy >= 0) {
return $vacancy;
}
}
}
return false;
}
/**
* Return the session details data from session extra field value
* @param $sessionId
* @return bool|mixed
*/
public function getSessionDetails($sessionId)
{
if (!empty($sessionId)) {
// Assign variables
$fieldsArray = array('id', 'cost', 'place', 'allow_visitors', 'teaching_hours', 'brochure', 'banner');
$extraSession = new ExtraFieldValue('session');
$extraField = new ExtraField('session');
// Get session fields
$fieldList = $extraField->get_all(array(
'field_variable IN ( ?, ?, ?, ?, ?, ?, ? )' => $fieldsArray
));
// Index session fields
$fields = array();
foreach ($fieldList as $field) {
$fields[$field['id']] = $field['field_variable'];
}
$mergedArray = array_merge(array($sessionId), array_keys($fields));
$sessionFieldValueList = $extraSession->get_all(array('session_id = ? field_id IN ( ?, ?, ?, ?, ?, ?, ? )' => $mergedArray));
foreach ($sessionFieldValueList as $sessionFieldValue) {
// Check if session field value is set in session field list
if (isset($fields[$sessionFieldValue['field_id']])) {
$var = $fields[$sessionFieldValue['field_id']];
$val = $sessionFieldValue['field_value'];
// Assign session field value to session
$sessionArray[$var] = $val;
}
}
$sessionArray['description'] = SessionManager::getDescriptionFromSessionId($sessionId);
return $sessionArray;
}
return false;
}
/**
* Get status message
* @param int $status
* @param bool $isAble
* @return string
*/
public function getStatusMessage($status, $isAble = true)
{
$message = '';
switch ($status)
{
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_NO_QUEUE:
if ($isAble) {
$message = $this->get_lang('AdvancedSubscriptionNoQueueIsAble');
} else {
$message = $this->get_lang('AdvancedSubscriptionNoQueue');
}
break;
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_START:
$message = $this->get_lang('AdvancedSubscriptionQueueStart');
break;
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_DISAPPROVED:
$message = $this->get_lang('AdvancedSubscriptionQueueBossDisapproved');
break;
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_APPROVED:
$message = $this->get_lang('AdvancedSubscriptionQueueBossApproved');
break;
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_DISAPPROVED:
$message = $this->get_lang('AdvancedSubscriptionQueueAdminDisapproved');
break;
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED:
$message = $this->get_lang('AdvancedSubscriptionQueueAdminApproved');
break;
default:
$message = sprintf($this->get_lang('AdvancedSubscriptionQueueDefault'), $status);
}
return $message;
}
/**
* Return the url to go to session
* @param $sessionId
* @return string
*/
public function getSessionUrl($sessionId)
{
$url = api_get_path(WEB_CODE_PATH) . 'session/?session_id=' . intval($sessionId);
return $url;
}
/**
* Return the url to enter to subscription queue to session
* @param $params
* @return string
*/
public function getQueueUrl($params)
{
$url = api_get_path(WEB_PLUGIN_PATH) . 'advanced_subscription/ajax/advanced_subscription.ajax.php?' .
'a=' . Security::remove_XSS($params['action']) . '&' .
's=' . intval($params['sessionId']) . '&' .
'current_user_id=' . intval($params['currentUserId']) . '&' .
'e=' . intval($params['newStatus']) . '&' .
'u=' . intval($params['studentUserId']) . '&' .
'q=' . intval($params['queueId']) . '&' .
'is_connected=' . intval($params['is_connected']) . '&' .
'profile_completed=' . intval($params['profile_completed']) . '&' .
'v=' . $this->generateHash($params);
return $url;
}
/**
* Return the list of student, in queue used by admin view
* @param int $sessionId
* @return array
*/
public function listAllStudentsInQueueBySession($sessionId)
{
// Filter input variable
$sessionId = intval($sessionId);
// Assign variables
$fieldsArray = array('target', 'publication_end_date', 'mode', 'recommended_number_of_participants', 'vacancies');
$sessionArray = api_get_session_info($sessionId);
$extraSession = new ExtraFieldValue('session');
$extraField = new ExtraField('session');
// Get session fields
$fieldList = $extraField->get_all(array(
'field_variable IN ( ?, ?, ?, ?, ?)' => $fieldsArray
));
// Index session fields
$fields = array();
foreach ($fieldList as $field) {
$fields[$field['id']] = $field['field_variable'];
}
$mergedArray = array_merge(array($sessionId), array_keys($fields));
$sessionFieldValueList = $extraSession->get_all(array('session_id = ? field_id IN ( ?, ?, ?, ?, ?, ?, ? )' => $mergedArray));
foreach ($sessionFieldValueList as $sessionFieldValue) {
// Check if session field value is set in session field list
if (isset($fields[$sessionFieldValue['field_id']])) {
$var = $fields[$sessionFieldValue['field_id']];
$val = $sessionFieldValue['field_value'];
// Assign session field value to session
$sessionArray[$var] = $val;
}
}
$queueTable = Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE);
$userTable = Database::get_main_table(TABLE_MAIN_USER);
$userJoinTable = $queueTable . ' q INNER JOIN ' . $userTable . ' u ON q.user_id = u.user_id';
$where = array(
'where' =>
array(
'q.session_id = ? AND q.status <> ? AND q.status <> ?' => array(
$sessionId,
ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED,
ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_DISAPPROVED,
)
)
);
$select = 'u.user_id, u.firstname, u.lastname, q.created_at, q.updated_at, q.status, q.id as queue_id';
$students = Database::select($select, $userJoinTable, $where);
foreach ($students as &$student) {
$status = intval($student['status']);
switch($status) {
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_NO_QUEUE:
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_START:
$student['validation'] = '';
break;
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_DISAPPROVED:
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_DISAPPROVED:
$student['validation'] = get_lang('No');
break;
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_APPROVED:
case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED:
$student['validation'] = get_lang('Yes');
break;
default:
error_log(__FILE__ . ' ' . __FUNCTION__ . ' Student status no detected');
}
}
$return = array(
'session' => $sessionArray,
'students' => $students,
);
return $return;
}
/**
* List all session (id, name) for select input
* @param int $limit
* @return array
*/
public function listAllSessions($limit = 100)
{
$limit = intval($limit);
$sessionTable = Database::get_main_table(TABLE_MAIN_SESSION);
$columns = 'id, name';
$conditions = array();
if ($limit > 0) {
$conditions = array(
'order' => 'name',
'limit' => $limit,
);
}
return Database::select($columns, $sessionTable, $conditions);
}
/**
* Generate security hash to check data send by url params
* @param string $data
* @return string
*/
public function generateHash($data)
{
$key = sha1($this->get('secret_key'));
// Prepare array to have specific type variables
$dataPrepared['action'] = strval($data['action']);
$dataPrepared['sessionId'] = intval($data['sessionId']);
$dataPrepared['currentUserId'] = intval($data['currentUserId']);
$dataPrepared['studentUserId'] = intval($data['studentUserId']);
$dataPrepared['queueId'] = intval($data['queueId']);
$dataPrepared['newStatus'] = intval($data['newStatus']);
$dataPrepared = serialize($dataPrepared);
return sha1($dataPrepared . $key);
}
/**
* Verify hash from data
* @param string $data
* @param string $hash
* @return bool
*/
public function checkHash($data, $hash)
{
return $this->generateHash($data) == $hash;
}
/**
* Copied and fixed from plugin.class.php
* Returns the "system" name of the plugin in lowercase letters
* @return string
*/
public function get_name()
{
return 'advanced_subscription';
}
}