Learning path - Add script cron to remind lp progress , partial to check @todo - refs BT#19569
parent
44e8edd3c2
commit
0c0fd473d9
@ -0,0 +1,260 @@ |
|||||||
|
<?php |
||||||
|
/* For licensing terms, see /license.txt */ |
||||||
|
|
||||||
|
/** |
||||||
|
* New lp reminder. |
||||||
|
* To add this extra field for lp option number_of_days_for_completion |
||||||
|
* INSERT INTO extra_field (extra_field_type, field_type, variable, display_text, default_value, field_order, visible_to_self, visible_to_others, changeable, filter, created_at) VALUES |
||||||
|
(6, 1, 'number_of_days_for_completion', 'NumberOfDaysForCompletion', '', 0, 1, 0, 1, 0, NOW()); |
||||||
|
* @package chamilo.cron |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
define('NUMBER_OF_DAYS_TO_RESEND_NOTIFICATION', 3); |
||||||
|
require_once __DIR__.'/../inc/global.inc.php'; |
||||||
|
|
||||||
|
|
||||||
|
// 24-hour format of an hour without leading zeros (in UTC timezone) to execute and search learning paths |
||||||
|
$timeSlots = [ |
||||||
|
7, |
||||||
|
16, |
||||||
|
20, |
||||||
|
]; |
||||||
|
|
||||||
|
/** |
||||||
|
* Initialization. |
||||||
|
*/ |
||||||
|
if ('cli' != php_sapi_name()) { |
||||||
|
exit; //do not run from browser |
||||||
|
} |
||||||
|
|
||||||
|
notifyUsersForCheckingLpCompletion(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Send the message to the intended user, manage the corresponding template and send through |
||||||
|
* MessageManager::send_message_simple, using this for the option of human resources managers. |
||||||
|
* |
||||||
|
* @param $toUserId |
||||||
|
* @param $courseId |
||||||
|
* @param $lpProgress |
||||||
|
* @param $registrationDate |
||||||
|
* @param $nbRemind |
||||||
|
* @return bool|int |
||||||
|
*/ |
||||||
|
function sendMessage( |
||||||
|
$toUserId, |
||||||
|
$courseId, |
||||||
|
$lpProgress, |
||||||
|
$registrationDate, |
||||||
|
$nbRemind |
||||||
|
) { |
||||||
|
|
||||||
|
$subjectTemplate = new Template( |
||||||
|
null, |
||||||
|
false, |
||||||
|
false, |
||||||
|
false, |
||||||
|
false, |
||||||
|
false |
||||||
|
); |
||||||
|
|
||||||
|
$courseInfo = api_get_course_info_by_id($courseId); |
||||||
|
$courseName = $courseInfo['title']; |
||||||
|
$subjectTemplate->assign('nbRemind', $nbRemind); |
||||||
|
$subjectTemplate->assign('courseName', $courseName); |
||||||
|
|
||||||
|
$subjectLayout = $subjectTemplate->get_template( |
||||||
|
'mail/lp_progress_reminder_subject.tpl' |
||||||
|
); |
||||||
|
|
||||||
|
$bodyTemplate = new Template( |
||||||
|
null, |
||||||
|
false, |
||||||
|
false, |
||||||
|
false, |
||||||
|
false, |
||||||
|
false |
||||||
|
); |
||||||
|
|
||||||
|
$userInfo = api_get_user_info($toUserId); |
||||||
|
$userFullName = api_get_person_name($userInfo['FirstName'], $userInfo['LastName']); |
||||||
|
|
||||||
|
$teachersListString = ''; |
||||||
|
$teachers = CourseManager::getTeachersFromCourse($courseId); |
||||||
|
if (!empty($teachers)) { |
||||||
|
$teachersList = []; |
||||||
|
foreach ($teachers as $value) { |
||||||
|
$teachersList[] = api_get_person_name( |
||||||
|
$value['firstname'], |
||||||
|
$value['lastname'], |
||||||
|
null, |
||||||
|
PERSON_NAME_EMAIL_ADDRESS |
||||||
|
); |
||||||
|
} |
||||||
|
$teachersListString = implode('<br/>', $teachersList); |
||||||
|
} |
||||||
|
|
||||||
|
$bodyTemplate->assign('courseName', $courseName); |
||||||
|
$bodyTemplate->assign('userFullName', $userFullName); |
||||||
|
$bodyTemplate->assign('username', $userInfo['username']); |
||||||
|
$bodyTemplate->assign('lpProgress', $lpProgress); |
||||||
|
$bodyTemplate->assign('registerDate', $registrationDate); |
||||||
|
$bodyTemplate->assign('trainers', $teachersListString); |
||||||
|
$bodyTemplate->assign('urlChamilo', api_get_path(WEB_PATH)); |
||||||
|
$bodyTemplate->assign('urlLostPw', api_get_path(WEB_CODE_PATH).'auth/lostPassword.php'); |
||||||
|
$bodyTemplate->assign('logoPortal', ''); |
||||||
|
|
||||||
|
$bodyLayout = $bodyTemplate->get_template( |
||||||
|
'mail/lp_progress_reminder_body.tpl' |
||||||
|
); |
||||||
|
$tittle = $subjectTemplate->fetch($subjectLayout); |
||||||
|
$content = $bodyTemplate->fetch($bodyLayout); |
||||||
|
|
||||||
|
return MessageManager::send_message_simple( |
||||||
|
$toUserId, |
||||||
|
$tittle, |
||||||
|
$content, |
||||||
|
1, |
||||||
|
true |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Number of reminder checking the frequency from NUMBER_OF_DAYS_TO_RESEND_NOTIFICATION |
||||||
|
* |
||||||
|
* @param $registrationDate |
||||||
|
* @param $nbDaysForLpCompletion |
||||||
|
* @return false|float|int |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
function getNbReminder($registrationDate, $nbDaysForLpCompletion):int |
||||||
|
{ |
||||||
|
$date1 = new DateTime($registrationDate); |
||||||
|
$date1->modify("+$nbDaysForLpCompletion day"); |
||||||
|
|
||||||
|
$date2 = new DateTime('now', new DateTimeZone('UTC')); |
||||||
|
|
||||||
|
$interval = $date1->diff($date2); |
||||||
|
$diffDays = (int) $interval->format('%a'); |
||||||
|
|
||||||
|
$nbRemind = ceil($diffDays / NUMBER_OF_DAYS_TO_RESEND_NOTIFICATION) + 1; |
||||||
|
|
||||||
|
return $nbRemind; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* It checks if user has to be notified checking the current registration date and nbDaysForLpCompletion value |
||||||
|
* |
||||||
|
* @param $registrationDate |
||||||
|
* @param $nbDaysForLpCompletion |
||||||
|
* @return bool |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
function isTimeToRemindUser($registrationDate, $nbDaysForLpCompletion):bool |
||||||
|
{ |
||||||
|
|
||||||
|
$date1 = new DateTime($registrationDate); |
||||||
|
$date1->modify("+$nbDaysForLpCompletion day"); |
||||||
|
$startDate = $date1->format('Y-m-d'); |
||||||
|
|
||||||
|
$date2 = new DateTime('now', new DateTimeZone('UTC')); |
||||||
|
$now = $date2->format('Y-m-d'); |
||||||
|
|
||||||
|
$reminder = false; |
||||||
|
if ($startDate < $now) { |
||||||
|
$interval = $date1->diff($date2); |
||||||
|
$diffDays = (int) $interval->format('%a'); |
||||||
|
$reminder = (0 === $diffDays % NUMBER_OF_DAYS_TO_RESEND_NOTIFICATION); |
||||||
|
} else { |
||||||
|
$reminder = $startDate === $now; |
||||||
|
} |
||||||
|
|
||||||
|
return $reminder; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Notify users for checking Learning path completion |
||||||
|
* |
||||||
|
* @return null |
||||||
|
* @throws Exception |
||||||
|
*/ |
||||||
|
function notifyUsersForCheckingLpCompletion() |
||||||
|
{ |
||||||
|
|
||||||
|
$lpItems = getLpIdWithDaysForCompletion(); |
||||||
|
if (count($lpItems) == 0) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
$tblTrackDefault = Database::get_main_table(TABLE_STATISTIC_TRACK_E_DEFAULT); |
||||||
|
$lpTable = Database::get_course_table(TABLE_LP_MAIN); |
||||||
|
$lpItemsString = implode(',', array_keys($lpItems)); |
||||||
|
|
||||||
|
$sql = "SELECT |
||||||
|
td.default_date as register_date, |
||||||
|
lp.id as lp_id, |
||||||
|
lp.c_id, |
||||||
|
td.session_id, |
||||||
|
td.default_value |
||||||
|
FROM |
||||||
|
$tblTrackDefault td |
||||||
|
INNER JOIN $lpTable lp ON (lp.c_id = td.c_id) |
||||||
|
WHERE |
||||||
|
td.default_event_type = 'user_subscribed' AND |
||||||
|
td.default_value_type = 'user_object' AND |
||||||
|
lp.id IN($lpItemsString)"; |
||||||
|
|
||||||
|
|
||||||
|
$rs = Database::query($sql); |
||||||
|
if (Database::num_rows($rs) > 0) { |
||||||
|
while ($row = Database::fetch_assoc($rs)) { |
||||||
|
|
||||||
|
//@todo To get the users registered in the course and checking the lp progress |
||||||
|
|
||||||
|
$isLpProgress100 = false; |
||||||
|
$registrationDate = ''; |
||||||
|
$courseId = ''; |
||||||
|
$toUserId = ''; |
||||||
|
$lpProgress = ''; |
||||||
|
$nbDaysForLpCompletion = $lpItems[$row['lp_id']]; |
||||||
|
$notify = isTimeToRemindUser($registrationDate, $nbDaysForLpCompletion); |
||||||
|
if ($notify && !$isLpProgress100) { |
||||||
|
$nbRemind = getNbReminder($registrationDate, $nbDaysForLpCompletion); |
||||||
|
sendMessage($toUserId, $courseId, $lpProgress, $registrationDate, $nbRemind); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* Returns the id of the LPs that have days for completion the progress through the extra |
||||||
|
* field 'number_of_days_for_completion'. |
||||||
|
*/ |
||||||
|
function getLpIdWithDaysForCompletion(): array |
||||||
|
{ |
||||||
|
$extraFieldValuesTable = Database::get_main_table(TABLE_EXTRA_FIELD_VALUES); |
||||||
|
$extraFieldTable = Database::get_main_table(TABLE_EXTRA_FIELD); |
||||||
|
$sql = "SELECT |
||||||
|
tblExtraFieldValues.item_id as lp_id, |
||||||
|
tblExtraFieldValues.value as ndays |
||||||
|
FROM |
||||||
|
$extraFieldValuesTable AS tblExtraFieldValues |
||||||
|
INNER JOIN $extraFieldTable AS tblExtraField ON ( |
||||||
|
tblExtraFieldValues.field_id = tblExtraField.id AND |
||||||
|
tblExtraField.variable = 'number_of_days_for_completion' |
||||||
|
) |
||||||
|
where |
||||||
|
tblExtraFieldValues.value > 0"; |
||||||
|
$result = Database::query($sql); |
||||||
|
$return = []; |
||||||
|
while ($element = Database::fetch_array($result)) { |
||||||
|
$return[$element['lp_id']] = $element['ndays']; |
||||||
|
} |
||||||
|
|
||||||
|
return $return; |
||||||
|
} |
||||||
|
|
||||||
|
exit(); |
@ -0,0 +1,16 @@ |
|||||||
|
<p> |
||||||
|
{{'HelloX'|get_lang|format(userFullName)}} |
||||||
|
</p> |
||||||
|
|
||||||
|
<p> |
||||||
|
{{'YouAreRegCourseXFromDateX'|get_lang|format(courseName,registerDate)}}<br /> |
||||||
|
{{'ThisMessageIsAboutX'}|get_lang|format(lpProgress)}} |
||||||
|
</p> |
||||||
|
|
||||||
|
<p> |
||||||
|
{{'StepsToRemindX'|get_lang|format(urlChamilo,username,urlLostPw)}} |
||||||
|
</p> |
||||||
|
|
||||||
|
<p> |
||||||
|
{{'LpRemindFooterX'|get_lang|format(logoPortal, trainers)}} |
||||||
|
</p> |
@ -0,0 +1 @@ |
|||||||
|
{{'RemindXLpCourseX'|get_lang|format(nbRemind,courseName)}} |
Loading…
Reference in new issue