diff --git a/plugin/advanced_subscription/config.php b/plugin/advanced_subscription/config.php index cc698f4757..9d1df8e83b 100644 --- a/plugin/advanced_subscription/config.php +++ b/plugin/advanced_subscription/config.php @@ -15,6 +15,10 @@ define('ADVANCED_SUBSCRIPTION_ACTION_SUPERIOR_SELECT', 3); define('ADVANCED_SUBSCRIPTION_ACTION_ADMIN_APPROVE', 4); define('ADVANCED_SUBSCRIPTION_ACTION_ADMIN_DISAPPROVE', 5); define('ADVANCED_SUBSCRIPTION_ACTION_STUDENT_REQUEST_NO_BOSS', 6); +define('ADVANCED_SUBSCRIPTION_ACTION_REMINDER_STUDENT', 7); +define('ADVANCED_SUBSCRIPTION_ACTION_REMINDER_SUPERIOR', 8); +define('ADVANCED_SUBSCRIPTION_ACTION_REMINDER_SUPERIOR_MAX', 9); +define('ADVANCED_SUBSCRIPTION_ACTION_REMINDER_ADMIN', 10); define('ADVANCED_SUBSCRIPTION_QUEUE_STATUS_NO_QUEUE', -1); define('ADVANCED_SUBSCRIPTION_QUEUE_STATUS_START', 0); diff --git a/plugin/advanced_subscription/cron/notify_by_mail.php b/plugin/advanced_subscription/cron/notify_by_mail.php new file mode 100644 index 0000000000..bcc93bc94e --- /dev/null +++ b/plugin/advanced_subscription/cron/notify_by_mail.php @@ -0,0 +1,158 @@ + array( + //'s.date_start >= ? + 'uu.relation_type = ? AND asq.updated_at <= ?' => array( + //api_get_utc_datetime(), + USER_RELATION_TYPE_BOSS, + $weekAgo + ) + ), + 'order' => 's.id', +); + +$queueList = Database::select($columns, $joinTables, $conditions); + +/** + * Remind students + */ +$sessionInfoList = array(); +foreach ($queueList as $queueItem) { + if (!isset($sessionInfoList[$queueItem['session_id']])) { + $sessionInfoList[$queueItem['session_id']] = api_get_session_info($queueItem['session_id']); + } +} + +foreach ($queueList as $queueItem) { + switch ($queueItem['status']) { + case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_START: + // No break + case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_APPROVED: + $data = array('sessionId' => $queueItem['session_id']); + $data['session'] = api_get_session_info($queueItem['session_id']); + $data['student'] = api_get_user_info($queueItem['student_id']); + $plugin->sendMail($data, ADVANCED_SUBSCRIPTION_ACTION_REMINDER_STUDENT); + break; + default: + break; + } +} + +/** + * Remind superiors + */ +// Get recommended number of participants +$sessionRecommendedNumber = array(); +foreach ($queueList as $queueItem) { + $row = + $sessionExtraFieldValue->get_values_by_handler_and_field_variable( + $queueItem['session_id'], + 'recommended_number_of_participants' + ); + $sessionRecommendedNumber[$queueItem['session_id']] = $row['field_value']; +} +// Group student by superior and session +$queueBySuperior = array(); +foreach ($queueList as $queueItem) { + $queueBySuperior[$queueItem['session_id']][$queueItem['superior_id']][$queueItem['student_id']]['status'] = $queueItem['status']; +} + +foreach ($queueBySuperior as $sessionId => $superiorStudents) { + $data = array( + 'sessionId' => $sessionId, + 'session' => $sessionInfoList[$sessionId], + 'students' => array(), + + ); + $dataUrl = array( + 'action' => 'confirm', + 'sessionId' => $sessionId, + 'currentUserId' => 0, + 'newStatus' => ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_APPROVED, + 'studentUserId' => 0, + 'is_connected' => 0, + 'profile_completed' => 0, + ); + foreach ($superiorStudents as $superiorId => $students) { + $data['superior'] = api_get_user_info($superiorId); + // Check if superior has at least one student + if (count($students) > 0) { + foreach ($students as $studentId => $studentInfo) { + if ($studentInfo['status'] != ADVANCED_SUBSCRIPTION_QUEUE_STATUS_START) { + $data['students'][$studentId] = api_get_user_info($studentId); + $dataUrl['studentUserId'] = $studentId; + $dataUrl['newStatus'] = ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_APPROVED; + $data['students'][$studentId]['acceptUrl'] = $plugin->getQueueUrl($dataUrl); + $dataUrl['newStatus'] = ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_DISAPPROVED; + $data['students'][$studentId]['rejectUrl'] = $plugin->getQueueUrl($dataUrl); + } + } + + if (is_array($data['students']) && count($data['students']) > 0) { + // Check if superior have more than recommended + if ($sessionRecommendedNumber[$sessionId] >= count($students)) { + // Is greater or equal than recommended + $plugin->sendMail($data, ADVANCED_SUBSCRIPTION_ACTION_REMINDER_SUPERIOR); + } else { + // Is less than recommended + $plugin->sendMail($data, ADVANCED_SUBSCRIPTION_ACTION_REMINDER_SUPERIOR_MAX); + } + } + + } + } +} + +/** + * Remind admins + */ +$admins = UserManager::get_all_administrators(); +$isWesternNameOrder = api_is_western_name_order(); +foreach ($admins as &$admin) { + $admin['complete_name'] = $isWesternNameOrder ? + $admin['firstname'] . ', ' . $admin['lastname'] : + $admin['lastname'] . ', ' . $admin['firstname'] + ; +} +unset($admin); +$queueByAdmin = array(); +foreach ($queueList as $queueItem) { + if ($queueItem['status'] != ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_APPROVED) { + $queueByAdmin[$queueItem['session_id']]['students'][$queueItem['student_id']]['user_id'] = $queueItem['student_id']; + } +} +$data = array( + 'admins' => $admins, +); +foreach ($queueByAdmin as $sessionId => $studentInfo) { + $data['sessionId'] = $sessionId; + $data['admin_view_url'] = api_get_path(WEB_PLUGIN_PATH) . + 'advanced_subscription/src/admin_view.php?s=' . $data['sessionId']; + $data['session'] = $sessionInfoList[$sessionId]; + $data['students'] = $studentInfo['students']; + $plugin->sendMail($data, ADVANCED_SUBSCRIPTION_ACTION_REMINDER_ADMIN); +} \ No newline at end of file diff --git a/plugin/advanced_subscription/lang/english.php b/plugin/advanced_subscription/lang/english.php index af37632c5d..d32775824b 100644 --- a/plugin/advanced_subscription/lang/english.php +++ b/plugin/advanced_subscription/lang/english.php @@ -48,6 +48,9 @@ $strings['MailStudentRequestSelect'] = 'Student registration requests selection' $strings['MailAdminAccept'] = 'Registration request accepted by administrator'; $strings['MailAdminReject'] = 'Registration request rejected by administrator'; $strings['MailStudentRequestNoBoss'] = 'Student registration request without boss'; +$strings['MailRemindStudent'] = 'Subscription request reminder'; +$strings['MailRemindSuperior'] = 'Subscription request are pending your approval'; +$strings['MailRemindAdmin'] = 'Course subscription are pending your approval'; // TPL langs // Admin view diff --git a/plugin/advanced_subscription/lang/spanish.php b/plugin/advanced_subscription/lang/spanish.php index 041a488be8..8f7657e569 100644 --- a/plugin/advanced_subscription/lang/spanish.php +++ b/plugin/advanced_subscription/lang/spanish.php @@ -48,6 +48,9 @@ $strings['MailStudentRequestSelect'] = 'Selección de solicitudes de registro de $strings['MailAdminAccept'] = 'Solicitud de registro aceptada por administrador'; $strings['MailAdminReject'] = 'Solicitud de registro rechazada por administrador'; $strings['MailStudentRequestNoBoss'] = 'Solicitud de registro de estudiante sin superior'; +$strings['MailRemindStudent'] = 'Recordatorio de la solicitud de inscripción'; +$strings['MailRemindSuperior'] = 'Solicitudes de inscripción estan pendientes de tu aprobación'; +$strings['MailRemindAdmin'] = 'Inscripciones de cursos estan pendientes de tu aprobación'; // TPL translations // Admin view diff --git a/plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php b/plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php index 685490d5fc..3f0e6ba1ea 100644 --- a/plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php +++ b/plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php @@ -285,7 +285,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface /** * Send message for the student subscription approval to a specific session - * @param int $studentId + * @param int|array $studentId * @param int $receiverId * @param string $subject * @param string $content @@ -303,7 +303,14 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface if ($save && !empty($mailId)) { // Save as sent message - $this->saveLastMessage($mailId, $studentId, $sessionId); + 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; } @@ -573,6 +580,50 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface ); } 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; } diff --git a/plugin/advanced_subscription/src/scripts/insert_session_fields.php b/plugin/advanced_subscription/src/scripts/insert_session_fields.php new file mode 100644 index 0000000000..a70acd26cb --- /dev/null +++ b/plugin/advanced_subscription/src/scripts/insert_session_fields.php @@ -0,0 +1,203 @@ +save(array( + 'field_type' => ExtraField::FIELD_TYPE_INTEGER, + 'field_variable' => 'teaching_hours', + 'field_display_text' => get_lang('TeachingHours'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$cost = new ExtraField('session'); +$cost->save(array( + 'field_type' => ExtraField::FIELD_TYPE_FLOAT, + 'field_variable' => 'cost', + 'field_display_text' => get_lang('Cost'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$vacancies = new ExtraField('session'); +$vacancies->save(array( + 'field_type' => ExtraField::FIELD_TYPE_INTEGER, + 'field_variable' => 'vacancies', + 'field_display_text' => get_lang('Vacancies'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$recommendedNumberOfParticipants = new ExtraField('session'); +$recommendedNumberOfParticipants->save(array( + 'field_type' => ExtraField::FIELD_TYPE_INTEGER, + 'field_variable' => 'recommended_number_of_participants', + 'field_display_text' => get_lang('RecommendedNumberOfParticipants'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$place = new ExtraField('session'); +$place->save(array( + 'field_type' => ExtraField::FIELD_TYPE_TEXT, + 'field_variable' => 'place', + 'field_display_text' => get_lang('Place'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$schedule = new ExtraField('session'); +$schedule->save(array( + 'field_type' => ExtraField::FIELD_TYPE_TEXT, + 'field_variable' => 'schedule', + 'field_display_text' => get_lang('Schedule'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$allowVisitors = new ExtraField('session'); +$allowVisitors->save(array( + 'field_type' => ExtraField::FIELD_TYPE_CHECKBOX, + 'field_variable' => 'allow_visitors', + 'field_display_text' => get_lang('AllowVisitors'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$modeOptions = array( + get_lang('Online'), + get_lang('Presencial'), + get_lang('B-Learning') +); + +$mode = new ExtraField('session'); +$mode->save(array( + 'field_type' => ExtraField::FIELD_TYPE_SELECT, + 'field_variable' => 'mode', + 'field_display_text' => get_lang('Mode'), + 'field_visible' => 1, + 'field_changeable' => 1, + 'field_options' => implode('; ', $modeOptions) +)); + +$isInductionSession = new ExtraField('session'); +$isInductionSession->save(array( + 'field_type' => ExtraField::FIELD_TYPE_CHECKBOX, + 'field_variable' => 'is_induccion_session', + 'field_display_text' => get_lang('IsInductionSession'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$isOpenSession = new ExtraField('session'); +$isOpenSession->save(array( + 'field_type' => ExtraField::FIELD_TYPE_CHECKBOX, + 'field_variable' => 'is_open_session', + 'field_display_text' => get_lang('IsOpenSession'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$duration = new ExtraField('session'); +$duration->save(array( + 'field_type' => ExtraField::FIELD_TYPE_TEXT, + 'field_variable' => 'human_text_duration', + 'field_display_text' => get_lang('DurationInWords'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$showStatusOptions = array( + get_lang('Open'), + get_lang('InProcess'), + get_lang('Closed') +); + +$showStatus = new ExtraField('session'); +$showStatus->save(array( + 'field_type' => ExtraField::FIELD_TYPE_SELECT, + 'field_variable' => 'show_status', + 'field_display_text' => get_lang('ShowStatus'), + 'field_visible' => 1, + 'field_changeable' => 1, + 'field_options' => implode('; ', $showStatusOptions) +)); + +$publicationStartDate = new ExtraField('session'); +$publicationStartDate->save(array( + 'field_type' => ExtraField::FIELD_TYPE_DATE, + 'field_variable' => 'publication_start_date', + 'field_display_text' => get_lang('PublicationStartDate'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$publicationEndDate = new ExtraField('session'); +$publicationEndDate->save(array( + 'field_type' => ExtraField::FIELD_TYPE_DATE, + 'field_variable' => 'publication_end_date', + 'field_display_text' => get_lang('PublicationEndDate'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$banner = new ExtraField('session'); +$banner->save(array( + 'field_type' => ExtraField::FIELD_TYPE_FILE_IMAGE, + 'field_variable' => 'banner', + 'field_display_text' => get_lang('SessionBanner'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$brochure = new ExtraField('session'); +$brochure->save(array( + 'field_type' => ExtraField::FIELD_TYPE_FILE, + 'field_variable' => 'brochure', + 'field_display_text' => get_lang('Brochure'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$targetOptions = array( + get_lang('Minedu'), + get_lang('Regiones') +); + +$target = new ExtraField('session'); +$target->save(array( + 'field_type' => ExtraField::FIELD_TYPE_SELECT, + 'field_variable' => 'target', + 'field_display_text' => get_lang('Target'), + 'field_visible' => 1, + 'field_changeable' => 1, + 'field_options' => implode('; ', $targetOptions) +)); + +$shortDescription = new ExtraField('session'); +$shortDescription->save(array( + 'field_type' => ExtraField::FIELD_TYPE_TEXT, + 'field_variable' => 'short_description', + 'field_display_text' => get_lang('ShortSescription'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); + +$id = new ExtraField('session'); +$id->save(array( + 'field_type' => ExtraField::FIELD_TYPE_TEXT, + 'field_variable' => 'id', + 'field_display_text' => get_lang('Id'), + 'field_visible' => 1, + 'field_changeable' => 1 +)); diff --git a/plugin/advanced_subscription/src/scripts/insert_sessions_categories.php b/plugin/advanced_subscription/src/scripts/insert_sessions_categories.php new file mode 100644 index 0000000000..69a255ca4d --- /dev/null +++ b/plugin/advanced_subscription/src/scripts/insert_sessions_categories.php @@ -0,0 +1,20 @@ + {% for student in students %} - +

{{ student.complete_name }}

diff --git a/plugin/advanced_subscription/views/reminder_notice_superior_max.tpl b/plugin/advanced_subscription/views/reminder_notice_superior_max.tpl index aa463461d5..54a9becdc6 100644 --- a/plugin/advanced_subscription/views/reminder_notice_superior_max.tpl +++ b/plugin/advanced_subscription/views/reminder_notice_superior_max.tpl @@ -57,7 +57,7 @@

{{ student.complete_name }}

- + {% endfor %}