Plugins: Pause training - fix cron dates + add debug BT#16298

pull/3440/head
Julio Montoya 5 years ago
parent 24796f0362
commit 907b44461e
  1. 118
      plugin/pausetraining/PauseTraining.php

@ -123,8 +123,6 @@ class PauseTraining extends Plugin
$login = Database::get_main_table(TABLE_STATISTIC_TRACK_E_LOGIN);
$userTable = Database::get_main_table(TABLE_MAIN_USER);
$usersNotificationPerDay = [];
$users = [];
$now = api_get_utc_datetime();
if (!empty($date)) {
$now = $date;
@ -136,6 +134,67 @@ class PauseTraining extends Plugin
echo "-------------------------------------------".PHP_EOL;
}
$extraFieldValue = new ExtraFieldValue('user');
$sql = "SELECT u.id
FROM $userTable u
WHERE u.status <> ".ANONYMOUS." AND u.active = 1";
$rs = Database::query($sql);
$users = [];
while ($user = Database::fetch_array($rs)) {
$userId = $user['id'];
$sql = "SELECT
MAX(t.logout_course_date) max_course_date,
MAX(l.logout_date) max_login_date
FROM $userTable u
LEFT JOIN $track t
ON (u.id = t.user_id)
LEFT JOIN $login l
ON (u.id = l.login_user_id)
WHERE
u.id = $userId
LIMIT 1
";
$result = Database::query($sql);
$data = Database::fetch_array($result);
$maxCourseDate = '';
$maxLoginDate = '';
// Take max date value.
if ($data) {
$maxCourseDate = $data['max_course_date'];
$maxLoginDate = $data['max_login_date'];
}
$maxEndPause = null;
$pause = $extraFieldValue->get_values_by_handler_and_field_variable($userId, 'pause_formation');
if (!empty($pause) && isset($pause['value']) && 1 == $pause['value']) {
$endDate = $extraFieldValue->get_values_by_handler_and_field_variable(
$userId,
'end_pause_date'
);
if (!empty($endDate) && isset($endDate['value']) && !empty($endDate['value'])) {
$maxEndPause = $endDate['value'];
}
}
$maxDate = $maxCourseDate;
if ($maxLoginDate > $maxCourseDate) {
$maxDate = $maxLoginDate;
}
if ($maxEndPause > $maxDate) {
$maxDate = $maxEndPause;
}
if (empty($maxDate)) {
// Nothing found for that user, skip.
continue;
}
$users[$userId] = $maxDate;
}
$extraFieldValue = new ExtraFieldValue('user');
foreach ($enableDaysList as $day) {
$day = (int) $day;
@ -156,46 +215,14 @@ class PauseTraining extends Plugin
$date->sub(new DateInterval('PT'.$hourEnd.'H'));
$hourEnd = $date->format('Y-m-d H:i:s');
$sql = "SELECT
u.id as user_id,
MAX(t.logout_course_date) max_course_date,
MAX(l.logout_date) max_login_date
FROM $userTable u
INNER JOIN $track t
ON (u.id = t.user_id)
INNER JOIN $login l
ON (u.id = l.login_user_id)
WHERE
u.status <> ".ANONYMOUS." AND
u.active = 1
GROUP BY u.id
HAVING
(max_course_date BETWEEN '$hourStart' AND '$hourEnd') OR
(max_login_date BETWEEN '$hourStart' AND '$hourEnd')
";
echo PHP_EOL.PHP_EOL."Processing day $day: $hourStart - $hourEnd ".PHP_EOL.PHP_EOL;
$rs = Database::query($sql);
if (!Database::num_rows($rs)) {
echo "No users to process for day $day".PHP_EOL.PHP_EOL;
foreach ($users as $userId => $maxDate) {
if (!($maxDate > $hourStart && $maxDate < $hourEnd)) {
echo "Message skipped for user #$userId because max date found: $maxDate not in range $hourStart - $hourEnd ".PHP_EOL;
continue;
}
echo "Processing day $day".PHP_EOL.PHP_EOL;
while ($user = Database::fetch_array($rs)) {
$userId = $user['user_id'];
if (in_array($userId, $users)) {
continue;
}
// Take max date value.
$maxCourseDate = $user['max_course_date'];
$maxLoginDate = $user['max_login_date'];
$maxDate = $maxCourseDate;
if ($maxLoginDate > $maxCourseDate) {
$maxDate = $maxLoginDate;
}
// Check if user has selected to pause formation.
$pause = $extraFieldValue->get_values_by_handler_and_field_variable($userId, 'pause_formation');
if (!empty($pause) && isset($pause['value']) && 1 == $pause['value']) {
@ -215,18 +242,19 @@ class PauseTraining extends Plugin
$startDate = $startDate['value'];
$endDate = $endDate['value'];
// Ignore date if is between the pause formation.
if ($now > $startDate && $now < $endDate) {
echo "Message skipped for user #$userId because today is $now and user is in pause formation between $startDate - $endDate ".PHP_EOL;
if ($startDate > $hourStart && $startDate < $hourStart) {
echo "Message skipped for user #$userId because process date $hourStart is in start pause in $startDate - $endDate ".PHP_EOL;
continue;
}
if ($endDate > $hourEnd && $endDate < $hourEnd) {
echo "Message skipped for user #$userId because process date $hourEnd is in start pause in $startDate - $endDate ".PHP_EOL;
continue;
} else {
echo "Message *NOT* skipped for user #$userId because today is $now and user is in pause formation between $startDate - $endDate ".PHP_EOL;
}
}
}
echo "User #$userId added to message queue because latest login is $maxDate between $hourStart AND $hourEnd".PHP_EOL;
$users[] = $userId;
$usersNotificationPerDay[$day][] = $userId;
}
@ -267,7 +295,7 @@ class PauseTraining extends Plugin
public function runCronTest()
{
$now = api_get_utc_datetime();
$days = 30;
$days = 15;
$before = new DateTime($now);
$before->sub(new DateInterval('P'.$days.'D'));

Loading…
Cancel
Save