diff --git a/plugin/pausetraining/PauseTraining.php b/plugin/pausetraining/PauseTraining.php index 68f3a57fc3..f47c3f3696 100644 --- a/plugin/pausetraining/PauseTraining.php +++ b/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; - continue; - } - - echo "Processing day $day".PHP_EOL.PHP_EOL; - - while ($user = Database::fetch_array($rs)) { - $userId = $user['user_id']; - if (in_array($userId, $users)) { + 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; } - // 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'));