Browse Source

Merge pull request #524 from danbarretodev/advsub

Update advsub plugin
Yannick Warnier 10 years ago
parent
commit
1fb1fc43c0

+ 1 - 1
main/inc/lib/hook/HookEvent.php

@@ -36,7 +36,7 @@ abstract class HookEvent implements HookEventInterface
 
     /**
      * Return the singleton instance of Hook event.
-     * @return HookEventInterface|null
+     * @return static
      */
     public static function create()
     {

+ 1 - 1
main/inc/lib/hook/HookObserver.php

@@ -34,7 +34,7 @@ abstract class HookObserver implements HookObserverInterface
     /**
      * Return the singleton instance of Hook observer.
      * If Hook Management plugin is not enabled, will return NULL
-     * @return HookEventInterface|null
+     * @return static
      */
     public static function create()
     {

+ 1 - 1
main/inc/lib/hook/interfaces/base/HookEventInterface.php

@@ -33,7 +33,7 @@ interface HookEventInterface
 
     /**
      * Return the singleton instance of Hook event.
-     * @return HookEventInterface|null
+     * @return static
      */
     public static function create();
 

+ 1 - 1
main/inc/lib/hook/interfaces/base/HookObserverInterface.php

@@ -10,7 +10,7 @@ interface HookObserverInterface
 {
     /**
      * Return the singleton instance of Hook observer.
-     * @return HookEventInterface|null
+     * @return static
      */
     public static function create();
 

+ 27 - 1
main/inc/lib/sessionmanager.lib.php

@@ -5485,7 +5485,19 @@ class SessionManager
                     )
                 )
             );
-
+            $whereFieldVariables = array();
+            $whereFieldIds = array();
+            if (
+                is_array($fieldsArray) &&
+                count($fieldsArray) > 0
+            ) {
+                $whereParams = '?';
+                for ($i = 1; $i < count($fieldsArray); $i++) {
+                    $whereParams .= ', ?';
+                }
+                $whereFieldVariables = 'field_variable IN ( ' . $whereParams .' )';
+                $whereFieldIds = 'field_id IN ( ' . $whereParams .  ' )';
+            }
             // Get session fields
             $extraField = new ExtraField('session');
             $questionMarks = substr(str_repeat('?, ', count($fieldsArray)), 0, -2);
@@ -5794,4 +5806,18 @@ class SessionManager
 
         return $resultData;
     }
+
+    public static function isValidId($sessionId)
+    {
+        $sessionId = intval($sessionId);
+        if ($sessionId > 0) {
+            $rows = Database::select('id', Database::get_main_table(TABLE_MAIN_SESSION), array('where' => array('id = ?' => $sessionId)));
+            if (!empty($rows)) {
+
+                return true;
+            }
+        }
+
+        return false;
+    }
 }

+ 9 - 7
plugin/advanced_subscription/ajax/advanced_subscription.ajax.php

@@ -21,7 +21,9 @@ $data['currentUserId'] = intval($_REQUEST['current_user_id']);
 $data['studentUserId'] = intval($_REQUEST['u']);
 $data['queueId'] = intval($_REQUEST['q']);
 $data['newStatus'] = intval($_REQUEST['e']);
-$data['is_connected'] = isset($_REQUEST['is_connected']) ? boolval($_REQUEST['is_connected']) : false;
+// Student always is connected
+// $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;
 // Init result array
 $result = array('error' => true, 'errorMessage' => get_lang('ThereWasAnError'));
@@ -227,20 +229,20 @@ if ($verified) {
                     $data['signature'] = api_get_setting('Institution');
                     $data['admin_view_url'] = api_get_path(WEB_PLUGIN_PATH) . 'advanced_subscription/src/admin_view.php?s=' . $data['sessionId'];
                     // Check if exist and action in data
-                    if (empty($data['action'])) {
+                    if (empty($data['mailAction'])) {
                         // set action in data by new status
                         switch ($data['newStatus']) {
                             case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_APPROVED:
-                                $data['action'] = ADVANCED_SUBSCRIPTION_ACTION_SUPERIOR_APPROVE;
+                                $data['mailAction'] = ADVANCED_SUBSCRIPTION_ACTION_SUPERIOR_APPROVE;
                                 break;
                             case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_BOSS_DISAPPROVED:
-                                $data['action'] = ADVANCED_SUBSCRIPTION_ACTION_SUPERIOR_DISAPPROVE;
+                                $data['mailAction'] = ADVANCED_SUBSCRIPTION_ACTION_SUPERIOR_DISAPPROVE;
                                 break;
                             case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED:
-                                $data['action'] = ADVANCED_SUBSCRIPTION_ACTION_ADMIN_APPROVE;
+                                $data['mailAction'] = ADVANCED_SUBSCRIPTION_ACTION_ADMIN_APPROVE;
                                 break;
                             case ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_DISAPPROVED:
-                                $data['action'] = ADVANCED_SUBSCRIPTION_ACTION_ADMIN_DISAPPROVE;
+                                $data['mailAction'] = ADVANCED_SUBSCRIPTION_ACTION_ADMIN_DISAPPROVE;
                                 break;
                             default:
                                 break;
@@ -253,7 +255,7 @@ if ($verified) {
                     }
 
                     // Send mails
-                    $result['mailIds'] = $plugin->sendMail($data, $data['action']);
+                    $result['mailIds'] = $plugin->sendMail($data, $data['mailAction']);
                     // Check if mails were sent
                     if (!empty($result['mailIds'])) {
                         $result['error'] = false;

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

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

@@ -0,0 +1,157 @@
+<?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 >= ? AND uu.relation_type = ? AND asq.updated_at <= ?' => array(
+            $now,
+            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' => true,
+        '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);
+}

+ 4 - 1
plugin/advanced_subscription/lang/english.php

@@ -37,7 +37,7 @@ $strings['AdvancedSubscriptionQueueStart'] = "Your subscription request is pendi
 $strings['AdvancedSubscriptionQueueBossDisapproved'] = "We are sorry, your subscription was rejected by your boss.";
 $strings['AdvancedSubscriptionQueueBossApproved'] = "Your subscription request has been accepted by your boss, now is pending for vacancies.";
 $strings['AdvancedSubscriptionQueueAdminDisapproved'] = "We are sorry, your subscription was rejected by the administrator.";
-$strings['AdvancedSubscriptionQueueAdminApproved'] = "Congratulation, your subscription request has been accepted by administrator";
+$strings['AdvancedSubscriptionQueueAdminApproved'] = "Congratulations!, your subscription request has been accepted by administrator.";
 $strings['AdvancedSubscriptionQueueDefaultX'] = "There was an error, queue status %d is not defined by system.";
 
 // Mail translations
@@ -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

+ 11 - 8
plugin/advanced_subscription/lang/spanish.php

@@ -31,14 +31,14 @@ $strings['AdvancedSubscriptionNotMoreAble'] = "Lo sentimos, usted ya no cumple c
 $strings['AdvancedSubscriptionIncompleteParams'] = "Los parámetros enviados no están completos o no son los correctos.";
 $strings['AdvancedSubscriptionIsNotEnabled'] = "La inscripción avanzada no está activada";
 
-$strings['AdvancedSubscriptionNoQueue'] = "You are not subscribed for this course.";
-$strings['AdvancedSubscriptionNoQueueIsAble'] = "You are not subscribed, but you are qualified for this course.";
-$strings['AdvancedSubscriptionQueueStart'] = "Your subscription request is pending for approval by your boss, please wait attentive.";
-$strings['AdvancedSubscriptionQueueBossDisapproved'] = "We are sorry, your subscription was rejected by your boss.";
-$strings['AdvancedSubscriptionQueueBossApproved'] = "Your subscription request has been accepted by your boss, now is pending for vacancies.";
-$strings['AdvancedSubscriptionQueueAdminDisapproved'] = "We are sorry, your subscription was rejected by the administrator.";
-$strings['AdvancedSubscriptionQueueAdminApproved'] = "Congratulation, your subscription request has been accepted by administrator";
-$strings['AdvancedSubscriptionQueueDefaultX'] = "There was an error, queue status %d is not defined by system.";
+$strings['AdvancedSubscriptionNoQueue'] = "Usted no está inscrito para este curso.";
+$strings['AdvancedSubscriptionNoQueueIsAble'] = "Usted no está inscrito, pero está calificado para este curso.";
+$strings['AdvancedSubscriptionQueueStart'] = "Su solicitud de inscripción está pendiente de la aprobación de su jefe, por favor espere atentamente.";
+$strings['AdvancedSubscriptionQueueBossDisapproved'] = "Lo sentimos, tu inscripción fue rechazada por tu jefe.";
+$strings['AdvancedSubscriptionQueueBossApproved'] = "Tu solicitud de inscripción ha sido aceptado por tu jefe, ahora está en espera de vacantes.";
+$strings['AdvancedSubscriptionQueueAdminDisapproved'] = "Lo sentimos, Tu inscripción ha sido rechazada por el administrador.";
+$strings['AdvancedSubscriptionQueueAdminApproved'] = "¡Felicitaciones! Tu inscripción ha sido aceptada por el administrador.";
+$strings['AdvancedSubscriptionQueueDefaultX'] = "Hubo un error el estado en cola %d no está definido en el sistema.";
 
 // Mail translations
 $strings['MailStudentRequest'] = 'Solicitud de registro de estudiante';
@@ -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

+ 148 - 48
plugin/advanced_subscription/src/AdvancedSubscriptionPlugin.php

@@ -111,64 +111,104 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface
      */
     public function isAllowedToDoRequest($userId, $params = array())
     {
-        if (isset($params['is_connected']) && isset($params['profile_completed'])) {
-            $isAllowed = null;
-            $plugin = self::create();
-            $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
+        $isAllowed = null;
+        $plugin = self::create();
+        $wsUrl = $plugin->get('ws_url');
+        // Student always is connected
+        $isConnected = true;
+        if ($isConnected) {
+            $profileCompletedMin = (float) $plugin->get('min_profile_percentage');
+            if (is_string($wsUrl) && !empty($wsUrl)) {
+                $options = array(
+                    'location' => $wsUrl,
+                    'uri' => $wsUrl
+                );
+                $client = new SoapClient(null, $options);
+                $userInfo = UserManager::get_user_info_by_id($userId);
+                try {
+                    $profileCompleted = $client->__soapCall('getProfileCompletionPercentage', $userInfo['extra']['drupal_user_id']);
+                } catch (\Exception $e) {
+                    $profileCompleted = 0;
+                }
+            } elseif (isset($params['profile_completed'])) {
                 $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');
-                        // @TODO: Get UIT completed by user this year by WS
-                        $uitUser = 0;
-                        $extra = new ExtraFieldValue('session');
-                        $var = $extra->get_values_by_handler_and_field_variable($params['session_id'], 'cost');
-                        $uitUser += $var['field_value'];
-                        if ($uitMax >= $uitUser) {
-                            $expendedTimeMax = $plugin->get('yearly_hours_limit');
-                            // @TODO: Get Expended time from user data
-                            $expendedTime = 0;
-                            $var = $extra->get_values_by_handler_and_field_variable($params['session_id'], 'duration');
-                            $expendedTime += $var['field_value'];
-                            if ($expendedTimeMax >= $expendedTime) {
-                                $expendedNumMax = $plugin->get('courses_count_limit');
-                                // @TODO: Get Expended num from user
-                                $expendedNum = 0;
-                                if ($expendedNumMax >= $expendedNum) {
-                                    $isAllowed = true;
-                                } else {
-                                    throw new \Exception($this->get_lang('AdvancedSubscriptionCourseXLimitReached'));
-                                }
+            } else {
+                $profileCompleted = 0;
+            }
+            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('AdvancedSubscriptionTimeXLimitReached'));
+                                throw new \Exception($this->get_lang('AdvancedSubscriptionCourseXLimitReached'));
                             }
                         } else {
-                            throw new \Exception($this->get_lang('AdvancedSubscriptionCostXLimitReached'));
+                            throw new \Exception($this->get_lang('AdvancedSubscriptionTimeXLimitReached'));
                         }
                     } else {
-                        throw new \Exception($this->get_lang('AdvancedSubscriptionIncompleteInduction'));
+                        throw new \Exception($this->get_lang('AdvancedSubscriptionCostXLimitReached'));
                     }
                 } else {
-                    throw new \Exception($this->get_lang('AdvancedSubscriptionProfileIncomplete'));
+                    throw new \Exception($this->get_lang('AdvancedSubscriptionIncompleteInduction'));
                 }
             } else {
-                throw new \Exception($this->get_lang('AdvancedSubscriptionNotConnected'));
+                throw new \Exception($this->get_lang('AdvancedSubscriptionProfileIncomplete'));
             }
-
-            return $isAllowed;
         } else {
-            throw new \Exception($this->get_lang('AdvancedSubscriptionIncompleteParams'));
+            throw new \Exception($this->get_lang('AdvancedSubscriptionNotConnected'));
         }
 
+        return $isAllowed;
     }
 
     /**
@@ -213,6 +253,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface
         $queueTable = Database::get_main_table(TABLE_ADVANCED_SUBSCRIPTION_QUEUE);
         $attributes = array(
             'last_message_id' => $mailId,
+            'updated_at' => api_get_utc_datetime(),
         );
 
         $num = Database::update(
@@ -254,7 +295,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
@@ -272,7 +313,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;
     }
@@ -542,6 +590,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/reminder_notice_admin.tpl'),
+                        $data['sessionId'],
+                        true
+                    );
+                }
+                break;
             default:
                 break;
         }
@@ -664,6 +756,8 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface
                 if ($vacancy >= 0) {
 
                     return $vacancy;
+                } else {
+                    return 0;
                 }
             }
         }
@@ -686,7 +780,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface
             $extraField = new ExtraField('session');
             // Get session fields
             $fieldList = $extraField->get_all(array(
-                'field_variable IN ( ?, ?, ?, ?, ?)' => $fieldsArray
+                'field_variable IN ( ?, ?, ?, ?, ?, ?, ? )' => $fieldsArray
             ));
             // Index session fields
             $fields = array();
@@ -711,6 +805,12 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface
             }
             $sessionArray['description'] = SessionManager::getDescriptionFromSessionId($sessionId);
 
+            if (isset($sessionArray['brochure'])) {
+                $sessionArray['brochure'] = api_get_path(WEB_CODE_PATH) . $sessionArray['brochure'];
+            }
+            if (isset($sessionArray['banner'])) {
+                $sessionArray['banner'] = api_get_path(WEB_CODE_PATH) . $sessionArray['banner'];
+            }
             return $sessionArray;
         }
 
@@ -783,7 +883,7 @@ class AdvancedSubscriptionPlugin extends Plugin implements HookPluginInterface
             'e=' . intval($params['newStatus']) . '&' .
             'u=' . intval($params['studentUserId']) . '&' .
             'q=' . intval($params['queueId']) . '&' .
-            'is_connected=' . intval($params['is_connected']) . '&' .
+            'is_connected=' . true . '&' .
             'profile_completed=' . intval($params['profile_completed']) . '&' .
             'v=' . $this->generateHash($params);
         return $url;

+ 66 - 53
plugin/advanced_subscription/src/HookAdvancedSubscription.php

@@ -17,14 +17,14 @@ class HookAdvancedSubscription extends HookObserver implements
     HookWSRegistrationObserverInterface,
     HookNotificationContentObserverInterface
 {
-    public $plugin;
+    public static $plugin;
 
     /**
      * Constructor. Calls parent, mainly.
      */
     protected function __construct()
     {
-        $this->plugin = AdvancedSubscriptionPlugin::create();
+        self::$plugin = AdvancedSubscriptionPlugin::create();
         parent::__construct(
             'plugin/advanced_subscription/src/HookAdvancedSubscription.class.php',
             'advanced_subscription'
@@ -93,7 +93,7 @@ class HookAdvancedSubscription extends HookObserver implements
                     // session.date_end
                     'date_end' => array('name' => 'date_end', 'type' => 'xsd:string'),
                     // session.human_text_duration
-                    'duration' => array('name' => 'duration', 'type' => 'xsd:string'),
+                    'human_text_duration' => array('name' => 'human_text_duration', 'type' => 'xsd:string'),
                     // session.vacancies
                     'vacancies' => array('name' => 'vacancies', 'type' => 'xsd:string'),
                     // session.schedule
@@ -167,8 +167,8 @@ class HookAdvancedSubscription extends HookObserver implements
                     'place' => array('name' => 'place', 'type' => 'xsd:string'),
                     // session.allow_visitors
                     'allow_visitors' => array('name' => 'allow_visitors', 'type' => 'xsd:string'),
-                    // session.duration
-                    'duration' => array('name' => 'duration', 'type' => 'xsd:int'),
+                    // session.teaching_hours
+                    'teaching_hours' => array('name' => 'teaching_hours', 'type' => 'xsd:int'),
                     // session.brochure
                     'brochure' => array('name' => 'brochure', 'type' => 'xsd:string'),
                     // session.banner
@@ -402,6 +402,7 @@ class HookAdvancedSubscription extends HookObserver implements
         } else {
             // Nothing to do
         }
+
         return false;
     }
 
@@ -438,13 +439,12 @@ class HookAdvancedSubscription extends HookObserver implements
 
         // Get the session brief List by category
         $fields = array(
+            'id',
             'short_description',
             'mode',
             'human_text_duration',
             'vacancies',
-            'brochure',
-            'target',
-            'schedule'
+            'schedule',
         );
         $sessionList = SessionManager::getShortSessionListAndExtraByCategory(
             $sessionCategoryId,
@@ -459,7 +459,7 @@ class HookAdvancedSubscription extends HookObserver implements
      * @param $params
      * @return null|soap_fault
      */
-    public function WSSessionGetDetailsByUser($params)
+    public static function WSSessionGetDetailsByUser($params)
     {
         global $debug;
 
@@ -475,53 +475,66 @@ class HookAdvancedSubscription extends HookObserver implements
         if (is_array($params) && !empty($params['session_id']) && !empty($params['user_id'])) {
             $userId = (int) $params['user_id'];
             $sessionId = (int) $params['session_id'];
-            // Check if student is already subscribed
-
-            $plugin = AdvancedSubscriptionPlugin::create();
-            $isOpen = $plugin->isSessionOpen($sessionId);
-            $status = $plugin->getQueueStatus($userId, $sessionId);
-            $vacancy = $plugin->getVacancy($sessionId);
-            $data = $plugin->getSessionDetails($sessionId);
-            if (!empty($data) && is_array($data)) {
-                $data['status'] = $status;
-                // 5 Cases:
-                if ($isOpen) {
-                    // Go to Course session
-                    $data['action_url'] = $plugin->getSessionUrl($sessionId);
-                } else {
-                    try {
-                        $isAble = $plugin->isAllowedToDoRequest($userId, $params);
-                        $data['message'] = $plugin->getStatusMessage($status, $isAble);
-                    } catch (\Exception $e) {
-                        $data['message'] = $e->getMessage();
-                    }
-                    $params['action'] = 'subscribe';
-                    $params['sessionId'] = intval($sessionId);
-                    $params['currentUserId'] = 0; // No needed
-                    $params['studentUserId'] = intval($userId);
-                    $params['queueId'] = 0; // No needed
-                    $params['newStatus'] = ADVANCED_SUBSCRIPTION_QUEUE_STATUS_START;
-                    if ($vacancy > 0) {
-                        // Check conditions
-                        if ($status === ADVANCED_SUBSCRIPTION_QUEUE_STATUS_NO_QUEUE) {
-                            // No in Queue, require queue subscription url action
-                            $data['action_url'] = $plugin->getQueueUrl($params);
-                        } elseif ($status === ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED) {
-                            // send url action
-                            $data['action_url'] = $plugin->getSessionUrl($sessionId);
-                        } else {
-                            // In queue, output status message, no more info.
-                        }
+            // Check if user exists
+            if (
+                UserManager::is_user_id_valid($userId) &&
+                SessionManager::isValidId($sessionId)
+            ) {
+                // Check if student is already subscribed
+                $plugin = AdvancedSubscriptionPlugin::create();
+                $isOpen = $plugin->isSessionOpen($sessionId);
+                $status = $plugin->getQueueStatus($userId, $sessionId);
+                $vacancy = $plugin->getVacancy($sessionId);
+                $data = $plugin->getSessionDetails($sessionId);
+                if (!empty($data) && is_array($data)) {
+                    $data['status'] = $status;
+                    // Vacancy and queue status cases:
+                    if ($isOpen) {
+                        // Go to Course session
+                        $data['action_url'] = self::$plugin->getSessionUrl($sessionId);
                     } else {
-                        if ($status === ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED) {
-                            $data['action_url'] = $plugin->getSessionUrl($sessionId);
+                        try {
+                            $isAllowed = self::$plugin->isAllowedToDoRequest($userId, $params);
+                            $data['message'] = self::$plugin->getStatusMessage($status, $isAllowed);
+                        } catch (\Exception $e) {
+                            $data['message'] = $e->getMessage();
+                        }
+                        $params['action'] = 'subscribe';
+                        $params['sessionId'] = intval($sessionId);
+                        $params['currentUserId'] = 0; // No needed
+                        $params['studentUserId'] = intval($userId);
+                        $params['queueId'] = 0; // No needed
+                        $params['newStatus'] = ADVANCED_SUBSCRIPTION_QUEUE_STATUS_START;
+                        if ($vacancy > 0) {
+                            // 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);
+                            } elseif ($status == ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED) {
+                                // send url action
+                                $data['action_url'] = self::$plugin->getSessionUrl($sessionId);
+                            } else {
+                                // In queue, output status message, no more info.
+                            }
                         } else {
-                            // in Queue or not, cannot be subscribed to session
-                            $data['action_url'] = $plugin->getQueueUrl($params);
+                            if ($status == ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED) {
+                                $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);
+                            } else {
+                                // In queue, output status message, no more info.
+                            }
                         }
                     }
+                    $result = $data;
+                } else {
+                    // Return soap fault No result was found
+                    $result = return_error(WS_ERROR_NOT_FOUND_RESULT);
                 }
-                $result = $data;
+            } else {
+                // Return soap fault No result was found
+                $result = return_error(WS_ERROR_NOT_FOUND_RESULT);
             }
         } else {
             // Return soap fault Not valid input params
@@ -587,14 +600,14 @@ class HookAdvancedSubscription extends HookObserver implements
         $plugin = AdvancedSubscriptionPlugin::create();
         foreach ($sessionList as &$session) {
             // Add validated and queue users count
-            $session['validated_user_num'] = $plugin->countQueueByParams(
+            $session['validated_user_num'] = self::$plugin->countQueueByParams(
                 array(
                     'sessions' => array($session['id']),
                     'status' => array(ADVANCED_SUBSCRIPTION_QUEUE_STATUS_ADMIN_APPROVED)
 
                 )
             );
-            $session['waiting_user_num'] = $plugin->countQueueByParams(
+            $session['waiting_user_num'] = self::$plugin->countQueueByParams(
                 array(
                     'sessions' => array($session['id']),
                     'status' => array(

+ 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')");
+}

+ 5 - 0
plugin/advanced_subscription/test/mails.php

@@ -1,4 +1,9 @@
 <?php
+/* For license terms, see /license.txt */
+/**
+ * A script to render all mails templates
+ * @package chamilo.plugin.advanced_subscription
+ */
 
 require_once __DIR__ . '/../config.php';
 

+ 49 - 0
plugin/advanced_subscription/test/ws_session_user.php

@@ -0,0 +1,49 @@
+<?php
+/* For license terms, see /license.txt */
+/**
+ * A script to test session details by user web service
+ * @package chamilo.plugin.advanced_subscription
+ */
+
+/**
+ * Init
+ */
+require_once __DIR__ . '/../config.php';
+// Protect test
+api_protect_admin_script();
+
+// exit;
+
+$plugin = AdvancedSubscriptionPlugin::create();
+$hookPlugin = HookAdvancedSubscription::create();
+// Get params from request (GET or POST)
+$params = array();
+// Init result array
+$params['user_id'] = intval($_REQUEST['u']);
+$params['session_id'] = intval($_REQUEST['s']);
+$params['profile_completed'] = 100;
+$params['secret_key'] = 'ed639d402804ffa347b489be3e42f28058e402bf';
+
+// Registration soap wsdl
+$wsUrl = 'http://chamilo19.net/main/webservices/registration.soap.php?wsdl';
+$options = array(
+    'location' => $wsUrl,
+    'uri' => $wsUrl,
+);
+
+/**
+ * WS test
+ */
+try {
+    // Init soap client
+    $client = new SoapClient(null, $options);
+    // Soap call to WS
+    $result = $client->__soapCall('HookAdvancedSubscription..WSSessionGetDetailsByUser', array($params));
+    echo '<pre>', print_r($result, 1) , '</pre>';
+    if (is_object($result) && isset($result->action_url)) {
+        echo '<br />';
+        echo Display::url($result->message, $result->action_url);
+    }
+} catch (\Exception $e) {
+    echo '<pre>', print_r($e, 1) , '</pre>';
+}

+ 2 - 2
plugin/advanced_subscription/views/admin_view.tpl

@@ -54,13 +54,13 @@
                                 class="btn btn-success btn-advanced-subscription btn-accept"
                                 href="{{ student.acceptUrl }}"
                             >
-                                {{ 'Accept' | get_plugin_lang('AdvancedSubscriptionPlugin') }}
+                                {{ 'AcceptInfinitive' | get_plugin_lang('AdvancedSubscriptionPlugin') }}
                             </a>
                             <a
                                 class="btn btn-danger btn-advanced-subscription btn-reject"
                                 href="{{ student.rejectUrl }}"
                             >
-                                {{ 'Reject' | get_plugin_lang('AdvancedSubscriptionPlugin') }}
+                                {{ 'RejectInfinitive' | get_plugin_lang('AdvancedSubscriptionPlugin') }}
                             </a>
                         </td>
                     </tr>

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

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

@@ -55,9 +55,9 @@
           <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.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 %}

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

@@ -49,7 +49,7 @@
                     <td height="356">&nbsp;</td>
                     <td valign="top"><p>{{ "MailDear" | get_plugin_lang("AdvancedSubscriptionPlugin") }}</p>
                         <h2>{{ admin.complete_name }}</h2>
-                        <p>{{ "MailContentStudentRequestNoSuperiorToAdmin"| get_plugin_lang("AdvancedSubscriptionPlugin") | format(complete_name_with_username, session.name, admin_view_url) }}</p>
+                        <p>{{ "MailContentStudentRequestNoSuperiorToAdmin"| get_plugin_lang("AdvancedSubscriptionPlugin") | format(student.complete_name_with_username, session.name, admin_view_url) }}</p>
                         <p>{{ "MailThankYou" | get_plugin_lang("AdvancedSubscriptionPlugin") }}</p>
                         <h3>{{ signature }}</h3></td>
                     <td>&nbsp;</td>