Jelajahi Sumber

Add cron notify by mail and scripts to plugin - refs BT#9094

Daniel Barreto 10 tahun lalu
induk
melakukan
5455a67fef

+ 4 - 0
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);

+ 158 - 0
plugin/advanced_subscription/cron/notify_by_mail.php

@@ -0,0 +1,158 @@
+<?php
+/* For license terms, see /license.txt */
+/**
+ * This script generates four session categories.
+ * @package chamilo.plugin.advanced_subscription
+ */
+
+/**
+ * Init
+ */
+
+require_once __DIR__ . '/../config.php';
+$plugin = AdvancedSubscriptionPlugin::create();
+$now = api_get_utc_datetime();
+$weekAgo = api_get_utc_datetime('-1 week');
+$sessionExtraField = new ExtraField('session');
+$sessionExtraFieldValue = new ExtraFieldValue('session');
+/**
+ * Get session list
+ */
+$joinTables = Database::get_main_table(TABLE_MAIN_SESSION) . ' s INNER JOIN ' .
+    Database::get_main_table(TABLE_MAIN_SESSION_USER) . ' su ON s.id = su.id_session INNER JOIN ' .
+    Database::get_main_table(TABLE_MAIN_USER_REL_USER) . ' uu ON su.id_user = uu.user_id INNER JOIN ' .
+    Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE) . ' asq ON su.id_session = asq.session_id AND su.id_user = asq.user_id';
+$columns = 's.id AS session_id, uu.friend_user_id AS superior_id, uu.user_id AS student_id, asq.id AS queue_id, asq.status AS status';
+$conditions = array(
+    'where' => 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);
+}

+ 3 - 0
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

+ 3 - 0
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

+ 53 - 2
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;
         }

+ 203 - 0
plugin/advanced_subscription/src/scripts/insert_session_fields.php

@@ -0,0 +1,203 @@
+<?php
+/* For license terms, see /license.txt */
+/**
+ * This script generates session fields needed for this plugin
+ * @package chamilo.plugin.advanced_subscription
+ */
+
+//exit;
+
+require_once __DIR__ . '/../../config.php';
+
+api_protect_admin_script();
+
+$teachingHours = new ExtraField('session');
+$teachingHours->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
+));

+ 20 - 0
plugin/advanced_subscription/src/scripts/insert_sessions_categories.php

@@ -0,0 +1,20 @@
+<?php
+/* For license terms, see /license.txt */
+/**
+ * This script generates four session categories.
+ * @package chamilo.plugin.advanced_subscription
+ */
+require_once __DIR__ . '/../../config.php';
+
+api_protect_admin_script();
+
+$categories = array(
+    'capacitaciones',
+    'programas',
+    'especializaciones',
+    'cursos prácticos'
+);
+$tableSessionCategory = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
+foreach ($categories as $category) {
+    Database::query("INSERT INTO $tableSessionCategory (name) VALUES ('$category')");
+}

+ 1 - 1
plugin/advanced_subscription/views/reminder_notice_superior.tpl

@@ -54,7 +54,7 @@
                         <table width="100%" border="0" cellspacing="3" cellpadding="4" style="background:#EDE9EA">
                             {% for student in students %}
                             <tr>
-                                <td valign="middle"><img src="{{ student.picture.file }}" width="50" height="50" alt=""></td>
+                                <td valign="middle"><img src="{{ student.avatar }}" width="50" height="50" alt=""></td>
                                 <td valign="middle"><h4>{{ student.complete_name }}</h4></td>
                                 <td valign="middle"><a href="{{ student.acceptUrl }}"><img src="{{ _p.web_plugin }}advanced_subscription/views/img/aprobar.png" width="90" height="25" alt=""></a></td>
                                 <td valign="middle"><a href="{{ student.rejectUrl }}"><img src="{{ _p.web_plugin }}advanced_subscription/views/img/desaprobar.png" width="90" height="25" alt=""></a></td>

+ 1 - 1
plugin/advanced_subscription/views/reminder_notice_superior_max.tpl

@@ -57,7 +57,7 @@
             <tr>
               <td valign="middle"><img src="{{ student.picture.file }}" width="50" height="50" alt=""></td>
               <td valign="middle"><h4>{{ student.complete_name }}</h4></td>
-              <td valign="middle"><a href="{{ student.approveUrl }}"><img src="{{ _p.web_plugin }}advanced_subscription/views/img/aprobar.png" width="90" height="25" alt=""></a></td>
+              <td valign="middle"><a href="{{ student.acceptUrl }}"><img src="{{ _p.web_plugin }}advanced_subscription/views/img/aprobar.png" width="90" height="25" alt=""></a></td>
               <td valign="middle"><a href="{{ student.rejectUrl }}"><img src="{{ _p.web_plugin }}advanced_subscription/views/img/desaprobar.png" width="90" height="25" alt=""></a></td>
             </tr>
             {% endfor %}