Browse Source

Merge pull request #546 from ilosada/BT9444

B#9444 - Add remind_course_expiration cron script
Yannick Warnier 10 years ago
parent
commit
ae0924053f
1 changed files with 132 additions and 0 deletions
  1. 132 0
      main/cron/remind_course_expiration.php

+ 132 - 0
main/cron/remind_course_expiration.php

@@ -0,0 +1,132 @@
+<?php
+/* For licensing terms, see /license.txt */
+/**
+ * Course expiration reminder.
+ * @package chamilo.cron
+ * @author Imanol Losada <imanol.losada@beeznest.com>
+ */
+require_once __DIR__ . '/../inc/global.inc.php';
+
+/**
+ * Initialization
+ */
+if (php_sapi_name() != 'cli') {
+    exit; //do not run from browser
+}
+
+// Days before expiration date to send reminders
+define("OFFSET", 2);
+$today = gmdate("Y-m-d");
+$expirationDate = gmdate("Y-m-d", strtotime($today." + ".OFFSET." day"));
+
+$query = "SELECT DISTINCT category.session_id, certificate.user_id FROM ".
+    Database::get_main_table(TABLE_MAIN_GRADEBOOK_CATEGORY)." AS category
+    LEFT JOIN ".Database::get_main_table(TABLE_MAIN_GRADEBOOK_CERTIFICATE).
+    " AS certificate ON category.id = certificate.cat_id
+    INNER JOIN ".Database::get_main_table(TABLE_MAIN_SESSION).
+    " AS session ON category.session_id = session.id
+    WHERE session.date_end BETWEEN '$today' AND '$expirationDate' AND category.session_id IS NOT NULL";
+
+$sessionId = 0;
+$userIds = array();
+$sessions = array();
+$result = Database::query($query);
+
+while ($row = Database::fetch_array($result)) {
+    if ($sessionId != $row['session_id']) {
+        $sessionId = $row['session_id'];
+        $userIds = array();
+    }
+    if (!is_null($row['user_id'])) {
+        array_push($userIds, $row['user_id']);
+    }
+    $sessions[$sessionId] = $userIds;
+}
+
+$usersToBeReminded = array();
+
+foreach ($sessions as $sessionId => $userIds) {
+    $userId = 0;
+    $userIds = $userIds ? " AND id_user NOT IN (".implode(",", $userIds).")" : null;
+    $query = "SELECT sessionUser.id_session, sessionUser.id_user, session.name, session.date_end FROM ".
+        Database::get_main_table(TABLE_MAIN_SESSION_USER)." AS sessionUser
+        INNER JOIN ".Database::get_main_table(TABLE_MAIN_SESSION).
+        " AS session ON sessionUser.id_session = session.id
+        WHERE id_session = $sessionId$userIds";
+    $result = Database::query($query);
+    while ($row = Database::fetch_array($result)) {
+        $usersToBeReminded[$row['id_user']][$row['id_session']] =
+            array(
+                'name' => $row['name'],
+                'date_end' => $row['date_end']
+            );
+    }
+}
+
+if ($usersToBeReminded) {
+    $today = date_create($today);
+    $platformLanguage = api_get_setting("platformLanguage");
+    $subject = sprintf(
+        get_lang("MailCronCourseExpirationReminderSubject", null, $platformLanguage),
+        api_get_setting("Institution")
+    );
+    $administrator = array(
+        'completeName' => api_get_person_name(
+            api_get_setting("administratorName"),
+            api_get_setting("administratorSurname"),
+            null,
+            PERSON_NAME_EMAIL_ADDRESS
+        ),
+        'email' => api_get_setting("emailAdministrator")
+    );
+    echo "\n======================================================================\n\n";
+    foreach ($usersToBeReminded as $userId => $sessions) {
+        $user = api_get_user_info($userId);
+        $userCompleteName = api_get_person_name(
+            $user['firstname'],
+            $user['lastname'],
+            null,
+            PERSON_NAME_EMAIL_ADDRESS
+        );
+        foreach ($sessions as $sessionId => $session) {
+            $daysRemaining = date_diff($today, date_create($session['date_end']));
+            $join = " INNER JOIN ".Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION)."ON id = access_url_id";
+            $result = Database::select(
+                'url',
+                Database::get_main_table(TABLE_MAIN_ACCESS_URL).$join,
+                array(
+                    'where' => array(
+                        'session_id = ?' => array(
+                            $sessionId
+                        )
+                    ),
+                    'limit' => '1'
+                )
+            );
+            $body = sprintf(
+                get_lang('MailCronCourseExpirationReminderBody', null, $platformLanguage),
+                $userCompleteName,
+                $session['name'],
+                $session['date_end'],
+                $daysRemaining->format("%d"),
+                $result[0]['url'],
+                api_get_setting("siteName")
+            );
+            api_mail_html(
+                $userCompleteName,
+                $user['email'],
+                $subject,
+                $body,
+                $administrator['completeName'],
+                $administrator['email']
+            );
+            echo "Email sent to $userCompleteName (".$user['email'].")\n";
+            echo "Session: ".$session['name']."\n";
+            echo "Date end: ".$session['date_end']."\n";
+            echo "Days remaining: ".$daysRemaining->format("%d")."\n\n";
+        }
+        echo "======================================================================\n\n";
+    }
+} else {
+    echo "No users to be reminded\n";
+}