diff --git a/plugin/advanced_subscription/ajax/advanced_subscription.ajax.php b/plugin/advanced_subscription/ajax/advanced_subscription.ajax.php index 10e523c111..f1e33ea8c2 100644 --- a/plugin/advanced_subscription/ajax/advanced_subscription.ajax.php +++ b/plugin/advanced_subscription/ajax/advanced_subscription.ajax.php @@ -25,6 +25,8 @@ $data['newStatus'] = intval($_REQUEST['e']); // $data['is_connected'] = isset($_REQUEST['is_connected']) ? boolval($_REQUEST['is_connected']) : false; $data['is_connected'] = true; $data['profile_completed'] = isset($_REQUEST['profile_completed']) ? floatval($_REQUEST['profile_completed']) : 0; +$data['accept_terms'] = isset($_REQUEST['accept_terms']) ? intval($_REQUEST['accept_terms']) : 0; +$data['courseId'] = isset($_REQUEST['c']) ? intval($_REQUEST['c']) : 0; // Init result array $result = array('error' => true, 'errorMessage' => get_lang('ThereWasAnError')); // Check if data is valid or is for start subscription @@ -51,6 +53,11 @@ if ($verified) { $res = AdvancedSubscriptionPlugin::create()->startSubscription($data['studentUserId'], $data['sessionId'], $data); // Check if queue subscription was successful if ($res === true) { + $legalEnabled = api_get_plugin_setting('courselegal', 'tool_enable'); + if ($legalEnabled) { + // Save terms confirmation + CourseLegalPlugin::create()->saveUserLegal($data['studentUserId'], $data['courseId'], $data['sessionId']); + } // Prepare data // Get session data // Assign variables @@ -126,9 +133,8 @@ if ($verified) { // Check if exist an email to render if (isset($result['mailIds']['render'])) { // Render mail - $message = MessageManager::get_message_by_id($result['mailIds']['render']); - $message = str_replace(array('

', '
', '
'), '', $message['content']); - echo $message; + $url = $plugin->getRenderMailUrl(array('queueId' => $result['mailIds']['render'])); + Header::location($url); exit; } } @@ -151,20 +157,27 @@ if ($verified) { // Check if exist an email to render if (isset($result['mailIds']['render'])) { // Render mail - $message = MessageManager::get_message_by_id($result['mailIds']['render']); - $message = str_replace(array('

', '
', '
'), '', $message['content']); - echo $message; + $url = $plugin->getRenderMailUrl(array('queueId' => $result['mailIds']['render'])); + Header::location($url); exit; } } } } else { - if (is_string($res)) { - $result['errorMessage'] = $res; + $lastMessageId = $plugin->getLastMessageId($data['studentUserId'], $data['sessionId']); + if ($lastMessageId !== false) { + // Render mail + $url = $plugin->getRenderMailUrl(array('queueId' => $lastMessageId)); + Header::location($url); + exit; } else { - $result['errorMessage'] = 'User can not be subscribed'; + if (is_string($res)) { + $result['errorMessage'] = $res; + } else { + $result['errorMessage'] = 'User can not be subscribed'; + } + $result['pass'] = false; } - $result['pass'] = false; } break; @@ -263,9 +276,8 @@ if ($verified) { // Check if exist mail to render if (isset($result['mailIds']['render'])) { // Render mail - $message = MessageManager::get_message_by_id($result['mailIds']['render']); - $message = str_replace(array('

', '
', '
'), '', $message['content']); - echo $message; + $url = $plugin->getRenderMailUrl(array('queueId' => $result['mailIds']['render'])); + Header::location($url); exit; } } diff --git a/plugin/advanced_subscription/config.php b/plugin/advanced_subscription/config.php index 9d1df8e83b..6bd8b7eef1 100644 --- a/plugin/advanced_subscription/config.php +++ b/plugin/advanced_subscription/config.php @@ -27,4 +27,9 @@ define('ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_APPROVED', 2); define('ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_DISAPPROVED', 3); define('ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED', 10); +define('ADVANCED_SUBSCRIPTION_TERMS_MODE_POPUP', 0); +define('ADVANCED_SUBSCRIPTION_TERMS_MODE_REJECT', 1); + + + require_once __DIR__ . '/../../main/inc/global.inc.php'; diff --git a/plugin/advanced_subscription/lang/english.php b/plugin/advanced_subscription/lang/english.php index adf7829226..e9925b17bc 100644 --- a/plugin/advanced_subscription/lang/english.php +++ b/plugin/advanced_subscription/lang/english.php @@ -135,3 +135,5 @@ $strings['MailContentReminderSuperiorSecond'] = 'We invite you to accept or reje $strings['MailTitleReminderMaxSuperior'] = 'Reminder: Course inscription request for your collaborators'; $strings['MailContentReminderMaxSuperior'] = 'We remind you, we have received inscription requests below to course %s for your collaborators. This course is starting at %s. Course details: %s.'; $strings['MailContentReminderMaxSuperiorSecond'] = 'This course have limited vacancies and has received a high inscription request rate, So we recommend all areas to accept at most %s candidates. We invite you to accept or reject inscription request, clicking corresponding button for each collaborator.'; + +$strings['YouMustAcceptTermsAndConditions'] = 'To subscribe to course %s, you must accept this terms and conditions.'; diff --git a/plugin/advanced_subscription/lang/spanish.php b/plugin/advanced_subscription/lang/spanish.php index 8c34867d2b..7e73b25434 100644 --- a/plugin/advanced_subscription/lang/spanish.php +++ b/plugin/advanced_subscription/lang/spanish.php @@ -135,3 +135,5 @@ $strings['MailContentReminderSuperiorSecond'] = 'Le invitamos a aprobar o desapr $strings['MailTitleReminderMaxSuperior'] = 'Recordatorio: Solicitud de consideración de curso para colaborador(es)'; $strings['MailContentReminderMaxSuperior'] = 'Le recordamos que hemos recibido las siguientes solicitudes de suscripción al curso %s de parte de sus colaboradores. El curso se iniciará el %s. Detalles del curso: %s.'; $strings['MailContentReminderMaxSuperiorSecond'] = 'Este curso tiene una cantidad de cupos limitados y ha recibido una alta tasa de solicitudes de inscripción, por lo que recomendamos que cada área apruebe un máximo de %s candidatos. Le invitamos a aprobar o desaprobar las suscripciones, dando clic en el botón correspondiente a continuación para cada colaborador.'; + +$strings['YouMustAcceptTermsAndConditions'] = 'Para inscribirse al curso %s, debe aceptar estos términos y condiciones.'; diff --git a/plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php b/plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php index aeae3ecc1a..b3e6515714 100644 --- a/plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php +++ b/plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php @@ -25,6 +25,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface 'min_profile_percentage' => 'text', 'check_induction' => 'boolean', 'secret_key' => 'text', + 'terms_and_conditions' => 'wysiwyg' ); parent::__construct('1.0', 'Imanol Losada, Daniel Barreto', $parameters); @@ -321,6 +322,17 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $studentId = intval($studentId); $this->saveLastMessage($mailId, $studentId, $sessionId); } + } elseif (!empty($mailId)) { + // Update queue row, updated_at + Database::update( + Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE), + array( + 'updated_at' => api_get_utc_datetime(), + ), + array( + 'user_id = ? AND session_id = ?' => array($studentId, $sessionId) + ) + ); } return $mailId; } @@ -430,7 +442,8 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $data['student']['user_id'], $this->get_lang('MailStudentRequest'), $template->fetch('/advanced_subscription/views/student_notice_student.tpl'), - $data['sessionId'] + $data['sessionId'], + true ); // Mail to superior $mailIds[] = $this->sendMailMessage( @@ -438,8 +451,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $data['superior']['user_id'], $this->get_lang('MailStudentRequest'), $template->fetch('/advanced_subscription/views/student_notice_superior.tpl'), - $data['sessionId'], - true + $data['sessionId'] ); break; case ADVANCED_SUBSCRIPTION_ACTION_SUPERIOR_APPROVE: @@ -449,7 +461,8 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $data['student']['user_id'], $this->get_lang('MailBossAccept'), $template->fetch('/advanced_subscription/views/superior_accepted_notice_student.tpl'), - $data['sessionId'] + $data['sessionId'], + true ); // Mail to superior $mailIds['render'] = $this->sendMailMessage( @@ -467,8 +480,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $adminId, $this->get_lang('MailBossAccept'), $template->fetch('/advanced_subscription/views/superior_accepted_notice_admin.tpl'), - $data['sessionId'], - true + $data['sessionId'] ); } break; @@ -498,7 +510,8 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $data['student']['user_id'], $this->get_lang('MailStudentRequestSelect'), $template->fetch('/advanced_subscription/views/student_notice_student.tpl'), - $data['sessionId'] + $data['sessionId'], + true ); // Mail to superior $mailIds['render'] = $this->sendMailMessage( @@ -506,8 +519,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $data['superior']['user_id'], $this->get_lang('MailStudentRequestSelect'), $template->fetch('/advanced_subscription/views/student_notice_superior.tpl'), - $data['sessionId'], - true + $data['sessionId'] ); break; case ADVANCED_SUBSCRIPTION_ACTION_ADMIN_APPROVE: @@ -517,7 +529,8 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $data['student']['user_id'], $this->get_lang('MailAdminAccept'), $template->fetch('/advanced_subscription/views/admin_accepted_notice_student.tpl'), - $data['sessionId'] + $data['sessionId'], + true ); // Mail to superior $mailIds[] = $this->sendMailMessage( @@ -535,8 +548,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $adminId, $this->get_lang('MailAdminAccept'), $template->fetch('/advanced_subscription/views/admin_accepted_notice_admin.tpl'), - $data['sessionId'], - true + $data['sessionId'] ); break; case ADVANCED_SUBSCRIPTION_ACTION_ADMIN_DISAPPROVE: @@ -575,7 +587,8 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $data['student']['user_id'], $this->get_lang('MailStudentRequestNoBoss'), $template->fetch('/advanced_subscription/views/student_no_superior_notice_student.tpl'), - $data['sessionId'] + $data['sessionId'], + true ); // Mail to admin foreach ($data['admins'] as $adminId => $admin) { @@ -585,8 +598,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $adminId, $this->get_lang('MailStudentRequestNoBoss'), $template->fetch('/advanced_subscription/views/student_no_superior_notice_admin.tpl'), - $data['sessionId'], - true + $data['sessionId'] ); } break; @@ -606,8 +618,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $data['superior']['user_id'], $this->get_lang('MailRemindSuperior'), $template->fetch('/advanced_subscription/views/reminder_notice_superior.tpl'), - $data['sessionId'], - true + $data['sessionId'] ); break; case ADVANCED_SUBSCRIPTION_ACTION_REMINDER_SUPERIOR_MAX: @@ -616,8 +627,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $data['superior']['user_id'], $this->get_lang('MailRemindSuperior'), $template->fetch('/advanced_subscription/views/reminder_notice_superior_max.tpl'), - $data['sessionId'], - true + $data['sessionId'] ); break; case ADVANCED_SUBSCRIPTION_ACTION_REMINDER_ADMIN: @@ -629,8 +639,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface $adminId, $this->get_lang('MailRemindAdmin'), $template->fetch('/advanced_subscription/views/reminder_notice_admin.tpl'), - $data['sessionId'], - true + $data['sessionId'] ); } break; @@ -883,7 +892,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface 'e=' . intval($params['newStatus']) . '&' . 'u=' . intval($params['studentUserId']) . '&' . 'q=' . intval($params['queueId']) . '&' . - 'is_connected=' . true . '&' . + 'is_connected=' . 1 . '&' . 'profile_completed=' . intval($params['profile_completed']) . '&' . 'v=' . $this->generateHash($params); return $url; @@ -1037,4 +1046,73 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface { return 'advanced_subscription'; } + + /** + * Return the url to show subscription terms + * @param array $params + * @param int $mode + * @return string + */ + public function getTermsUrl($params, $mode = ADVANCED_SUBSCRIPTION_TERMS_MODE_POPUP) + { + $url = api_get_path(WEB_PLUGIN_PATH) . 'advanced_subscription/src/terms_and_conditions.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=' . 1 . '&' . + 'profile_completed=' . intval($params['profile_completed']) . '&' . + 'r=' . intval($mode) . '&' . + 'v=' . $this->generateHash($params); + // Launch popup + if ($mode == ADVANCED_SUBSCRIPTION_TERMS_MODE_POPUP) { + $url = 'javascript:void(window.open(\'' . $url .'\',\'AdvancedSubscriptionTerms\', \'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,width=700px,height=600px\', \'100\' ))'; + } + return $url; + } + + /** + * Return the url to get mail rendered + * @param array $params + * @return string + */ + public function getRenderMailUrl($params) + { + $url = api_get_path(WEB_PLUGIN_PATH) . 'advanced_subscription/src/render_mail.php?' . + 'q=' . $params['queueId'] . '&' . + 'v=' . $this->generateHash($params); + return $url; + } + + /** + * Return the last message id from queue row + * @param int $studentUserId + * @param int $sessionId + * @return int|bool + */ + public function getLastMessageId($studentUserId, $sessionId) + { + $studentUserId = intval($studentUserId); + $sessionId = intval($sessionId); + if (!empty($sessionId) && !empty($studentUserId)) { + $row = Database::select( + 'last_message_id', + Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE), + array( + 'where' => array( + 'user_id = ? AND session_id = ?' => array($studentUserId, $sessionId), + ) + ) + ); + + if (count($row) > 0) { + + return $row[0]['last_message_id']; + } + } + + return false; + } } diff --git a/plugin/advanced_subscription/src/HookAdvancedSubscription.php b/plugin/advanced_subscription/src/HookAdvancedSubscription.php index 244ce8908e..4435416b5e 100644 --- a/plugin/advanced_subscription/src/HookAdvancedSubscription.php +++ b/plugin/advanced_subscription/src/HookAdvancedSubscription.php @@ -509,7 +509,7 @@ class HookAdvancedSubscription extends HookObserver implements // Check conditions if ($status == ADVANCED_SUBSCRIPTION_QUEUE_STATUS_NO_QUEUE) { // No in Queue, require queue subscription url action - $data['action_url'] = self::$plugin->getQueueUrl($params); + $data['action_url'] = self::$plugin->getTermsUrl($params); } elseif ($status == ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED) { // send url action $data['action_url'] = self::$plugin->getSessionUrl($sessionId); @@ -521,7 +521,7 @@ class HookAdvancedSubscription extends HookObserver implements $data['action_url'] = self::$plugin->getSessionUrl($sessionId); } elseif ($status == ADVANCED_SUBSCRIPTION_QUEUE_STATUS_NO_QUEUE) { // in Queue or not, cannot be subscribed to session - $data['action_url'] = self::$plugin->getQueueUrl($params); + $data['action_url'] = self::$plugin->getTermsUrl($params); } else { // In queue, output status message, no more info. } diff --git a/plugin/advanced_subscription/src/render_mail.php b/plugin/advanced_subscription/src/render_mail.php new file mode 100644 index 0000000000..c0974d1700 --- /dev/null +++ b/plugin/advanced_subscription/src/render_mail.php @@ -0,0 +1,25 @@ +checkHash($data, $hash); +if ($verified) { + // Render mail + $message = MessageManager::get_message_by_id($data['queueId']); + $message = str_replace(array('

', '
', '
'), '', $message['content']); + echo $message; +} \ No newline at end of file diff --git a/plugin/advanced_subscription/src/terms_and_conditions.php b/plugin/advanced_subscription/src/terms_and_conditions.php new file mode 100644 index 0000000000..78e0adf9f1 --- /dev/null +++ b/plugin/advanced_subscription/src/terms_and_conditions.php @@ -0,0 +1,84 @@ +get_lang('plugin_title')); + +if ( + !empty($data['sessionId']) && + !empty($data['studentUserId']) && + api_get_plugin_setting('courselegal', 'tool_enable') +) { + $lastMessageId = $plugin->getLastMessageId($data['studentUserId'], $data['sessionId']); + if ($lastMessageId !== false) { + // Render mail + $url = $plugin->getRenderMailUrl(array('queueId' => $lastMessageId)); + Header::location($url); + exit; + } + $courses = SessionManager::get_course_list_by_session_id($data['sessionId']); + $course = current($courses); + $data['courseId'] = $course['id']; + $legalEnabled = api_get_plugin_setting('courselegal', 'tool_enable'); + if ($legalEnabled) { + $courseLegal = CourseLegalPlugin::create(); + $termsAndConditions = $courseLegal->getData($data['courseId'], $data['sessionId']); + $termsAndConditions = $termsAndConditions['content']; + $termFiles = $courseLegal->getCurrentFile($data['courseId'], $data['sessionId']); + } else { + $termsAndConditions = $plugin->get('terms_and_conditions'); + $termFiles = ''; + } + + $data['session'] = api_get_session_info($data['sessionId']); + $data['student'] = Usermanager::get_user_info_by_id($data['studentUserId']); + $data['acceptTermsUrl'] = $plugin->getQueueUrl($data); + $data['rejectTermsUrl'] = $plugin->getTermsUrl($data, ADVANCED_SUBSCRIPTION_TERMS_MODE_REJECT); + // Use Twig with String loader + $twigString = new \Twig_Environment(new \Twig_Loader_String()); + $termsContent = $twigString->render( + $termsAndConditions, + array( + 'session' => $data['session'], + 'student' => $data['student'], + ) + ); + +} else { + $termsContent = ''; + $termFiles = ''; + $data['acceptTermsUrl'] = '#'; + $data['rejectTermsUrl'] = '#'; +} + +// Assign into content +$tpl->assign('termsRejected', $data['termsRejected']); +$tpl->assign('acceptTermsUrl', $data['acceptTermsUrl']); +$tpl->assign('rejectTermsUrl', $data['rejectTermsUrl']); +$tpl->assign('session', $data['session']); +$tpl->assign('student', $data['student']); +$tpl->assign('sessionId', $data['sessionId']); +$tpl->assign('termsContent', $termsContent); +$tpl->assign('termsFiles', $termFiles); +$content = $tpl->fetch('/advanced_subscription/views/terms_and_conditions.tpl'); +echo $content; diff --git a/plugin/advanced_subscription/test/ws_session_user.php b/plugin/advanced_subscription/test/ws_session_user.php index 05b7aed289..80a7ba6a46 100644 --- a/plugin/advanced_subscription/test/ws_session_user.php +++ b/plugin/advanced_subscription/test/ws_session_user.php @@ -22,10 +22,46 @@ $params = array(); $params['user_id'] = intval($_REQUEST['u']); $params['session_id'] = intval($_REQUEST['s']); $params['profile_completed'] = 100; -$params['secret_key'] = 'ed639d402804ffa347b489be3e42f28058e402bf'; + +/** + * Copied code from WSHelperVerifyKey function + */ +/** + * Start WSHelperVerifyKey + */ +//error_log(print_r($params,1)); +$check_ip = false; +$ip = trim($_SERVER['REMOTE_ADDR']); +// if we are behind a reverse proxy, assume it will send the +// HTTP_X_FORWARDED_FOR header and use this IP instead +if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { + list($ip1, $ip2) = split(',', $_SERVER['HTTP_X_FORWARDED_FOR']); + $ip = trim($ip1); +} +// Check if a file that limits access from webservices exists and contains +// the restraining check +if (is_file(api_get_path(WEB_CODE_PATH) .'webservices/webservice-auth-ip.conf.php')) { + include api_get_path(WEB_CODE_PATH).'webservices/webservice-auth-ip.conf.php'; + if (!empty($ws_auth_ip)) { + $check_ip = true; + } +} + +global $_configuration; +if ($check_ip) { + $security_key = $_configuration['security_key']; +} else { + $security_key = $ip.$_configuration['security_key']; + //error_log($secret_key.'-'.$security_key); +} +/** + * End WSHelperVerifyKey + */ + +$params['secret_key'] = sha1($security_key); // Registration soap wsdl -$wsUrl = 'http://chamilo19.net/main/webservices/registration.soap.php?wsdl'; +$wsUrl = api_get_path(WEB_CODE_PATH) . 'webservices/registration.soap.php?wsdl'; $options = array( 'location' => $wsUrl, 'uri' => $wsUrl, diff --git a/plugin/advanced_subscription/views/css/style.css b/plugin/advanced_subscription/views/css/style.css index 108ac52445..1582fc853d 100644 --- a/plugin/advanced_subscription/views/css/style.css +++ b/plugin/advanced_subscription/views/css/style.css @@ -60,4 +60,23 @@ #iframeAdvsub { width: 100%; height: 100%; +} + +.legal-terms-popup{ + margin-top: 5%; + margin-left: 5%; + margin-right: 5%; +} + +.legal-terms{ + width: 90%; + height: 50%; +} + +.legal-terms-buttons { + text-align: right; +} + +.legal-terms-title { + text-align: center; } \ No newline at end of file diff --git a/plugin/advanced_subscription/views/terms_and_conditions.tpl b/plugin/advanced_subscription/views/terms_and_conditions.tpl new file mode 100644 index 0000000000..20a4ba414c --- /dev/null +++ b/plugin/advanced_subscription/views/terms_and_conditions.tpl @@ -0,0 +1,49 @@ +{# start copy from head.tpl #} + + + + +{{ prefetch }} +{{ favico }} +{{ browser_specific_head }} + + + +{# Use the latest engine in ie8/ie9 or use google chrome engine if available #} +{# Improve usability in portal devices #} + +{{ title_string }} +{{ css_file_to_string }} +{{ css_style_print }} +{{ js_file_to_string }} +{# end copy from head.tpl #} + +{% if termsRejected == 1 %} + +{% endif %} + + + + + \ No newline at end of file