chamilo /
chamilo-lms
| 1 | <?php |
||
| 2 | |||
| 3 | /* For licensing terms, see /license.txt */ |
||
| 4 | |||
| 5 | /** |
||
| 6 | * This tool show global Statistics on general platform events. |
||
| 7 | */ |
||
| 8 | $cidReset = true; |
||
| 9 | |||
| 10 | require_once __DIR__.'/../../inc/global.inc.php'; |
||
| 11 | api_protect_admin_script(true); |
||
| 12 | |||
| 13 | $interbreadcrumb[] = ['url' => '../index.php', 'name' => get_lang('PlatformAdmin')]; |
||
| 14 | |||
| 15 | $report = $_REQUEST['report'] ?? ''; |
||
| 16 | $sessionDuration = isset($_GET['session_duration']) ? (int) $_GET['session_duration'] : ''; |
||
| 17 | $validated = false; |
||
| 18 | $sessionStatusAllowed = api_get_configuration_value('allow_session_status'); |
||
| 19 | $invoicingMonth = isset($_GET['invoicing_month']) ? (int) $_GET['invoicing_month'] : ''; |
||
| 20 | $invoicingYear = isset($_GET['invoicing_year']) ? (int) $_GET['invoicing_year'] : ''; |
||
| 21 | $tool_name = get_lang('Statistics'); |
||
| 22 | if (api_is_platform_admin()) { |
||
| 23 | $tools = [ |
||
| 24 | get_lang('Courses') => [ |
||
| 25 | 'report=courses' => get_lang('CountCours'), |
||
| 26 | 'report=tools' => get_lang('PlatformToolAccess'), |
||
| 27 | 'report=courselastvisit' => get_lang('LastAccess'), |
||
| 28 | 'report=coursebylanguage' => get_lang('CountCourseByLanguage'), |
||
| 29 | ], |
||
| 30 | get_lang('Users') => [ |
||
| 31 | 'report=users' => get_lang('CountUsers'), |
||
| 32 | 'report=recentlogins' => get_lang('Logins'), |
||
| 33 | 'report=logins&type=month' => get_lang('Logins').' ('.get_lang('PeriodMonth').')', |
||
| 34 | 'report=logins&type=day' => get_lang('Logins').' ('.get_lang('PeriodDay').')', |
||
| 35 | 'report=logins&type=hour' => get_lang('Logins').' ('.get_lang('PeriodHour').')', |
||
| 36 | 'report=pictures' => get_lang('CountUsers').' ('.get_lang('UserPicture').')', |
||
| 37 | 'report=logins_by_date' => get_lang('LoginsByDate'), |
||
| 38 | 'report=no_login_users' => get_lang('StatsUsersDidNotLoginInLastPeriods'), |
||
| 39 | 'report=zombies' => get_lang('Zombies'), |
||
| 40 | 'report=users_active' => get_lang('UserStats'), |
||
| 41 | 'report=users_online' => get_lang('UsersOnline'), |
||
| 42 | 'report=invoicing' => get_lang('InvoicingByAccessUrl'), |
||
| 43 | 'report=duplicated_users' => get_lang('DuplicatedUsers'), |
||
| 44 | 'report=duplicated_users_by_mail' => get_lang('DuplicatedUsersByMail'), |
||
| 45 | ], |
||
| 46 | get_lang('System') => [ |
||
| 47 | 'report=activities' => get_lang('ImportantActivities'), |
||
| 48 | 'report=user_session' => get_lang('PortalUserSessionStats'), |
||
| 49 | 'report=courses_usage' => get_lang('CoursesUsage'), |
||
| 50 | 'report=quarterly_report' => get_lang('QuarterlyReport'), |
||
| 51 | ], |
||
| 52 | get_lang('Social') => [ |
||
| 53 | 'report=messagereceived' => get_lang('MessagesReceived'), |
||
| 54 | 'report=messagesent' => get_lang('MessagesSent'), |
||
| 55 | 'report=friends' => get_lang('CountFriends'), |
||
| 56 | ], |
||
| 57 | get_lang('Session') => [ |
||
| 58 | 'report=session_by_date' => get_lang('SessionsByDate'), |
||
| 59 | ], |
||
| 60 | ]; |
||
| 61 | |||
| 62 | if ('true' === api_get_plugin_setting('lti_provider', 'enabled')) { |
||
| 63 | $tools[get_lang('Users')]['report=lti_tool_lp'] = get_lang('LearningPathLTI'); |
||
| 64 | } |
||
| 65 | } elseif (api_is_session_admin()) { |
||
| 66 | $tools = [ |
||
| 67 | get_lang('Session') => [ |
||
| 68 | 'report=session_by_date' => get_lang('SessionsByDate'), |
||
| 69 | ], |
||
| 70 | ]; |
||
| 71 | } |
||
| 72 | |||
| 73 | // Get list of allowed reports based on role |
||
| 74 | $allowedReports = []; |
||
| 75 | foreach ($tools as $section => $items) { |
||
| 76 | foreach ($items as $key => $label) { |
||
| 77 | if (preg_match('/report=([a-zA-Z0-9_]+)/', $key, $matches)) { |
||
| 78 | $allowedReports[] = $matches[1]; |
||
| 79 | } |
||
| 80 | } |
||
| 81 | } |
||
| 82 | |||
| 83 | // Ensure current report is valid for this user, or default to first available |
||
| 84 | if (!in_array($report, $allowedReports)) { |
||
| 85 | $report = reset($allowedReports); |
||
| 86 | } |
||
| 87 | |||
| 88 | if ( |
||
| 89 | in_array( |
||
| 90 | $report, |
||
| 91 | ['recentlogins', 'tools', 'courses', 'coursebylanguage', 'users', 'users_active', 'session_by_date'] |
||
| 92 | ) |
||
| 93 | ) { |
||
| 94 | $htmlHeadXtra[] = api_get_js('chartjs/Chart.min.js'); |
||
| 95 | $htmlHeadXtra[] = api_get_asset('chartjs-plugin-labels/build/chartjs-plugin-labels.min.js'); |
||
| 96 | |||
| 97 | // Prepare variables for the JS charts |
||
| 98 | $url = $reportName = $reportType = ''; |
||
| 99 | switch ($report) { |
||
| 100 | case 'recentlogins': |
||
| 101 | $url = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?a=recent_logins&session_duration=' |
||
| 102 | .$sessionDuration; |
||
| 103 | $reportName = ''; |
||
| 104 | $reportType = 'line'; |
||
| 105 | $reportOptions = ''; |
||
| 106 | $htmlHeadXtra[] = Statistics::getJSChartTemplate($url, $reportType, $reportOptions); |
||
| 107 | break; |
||
| 108 | case 'tools': |
||
| 109 | $url = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?a=tools_usage'; |
||
| 110 | $reportName = 'PlatformToolAccess'; |
||
| 111 | $reportType = 'pie'; |
||
| 112 | $reportOptions = ' |
||
| 113 | legend: { |
||
| 114 | position: "left" |
||
| 115 | }, |
||
| 116 | title: { |
||
| 117 | text: "'.get_lang($reportName).'", |
||
| 118 | display: true |
||
| 119 | }, |
||
| 120 | cutoutPercentage: 25 |
||
| 121 | '; |
||
| 122 | $htmlHeadXtra[] = Statistics::getJSChartTemplate($url, $reportType, $reportOptions); |
||
| 123 | break; |
||
| 124 | case 'courses': |
||
| 125 | $url = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?a=courses'; |
||
| 126 | $reportName = 'CountCours'; |
||
| 127 | $reportType = 'pie'; |
||
| 128 | $reportOptions = ' |
||
| 129 | legend: { |
||
| 130 | position: "left" |
||
| 131 | }, |
||
| 132 | title: { |
||
| 133 | text: "'.get_lang($reportName).'", |
||
| 134 | display: true |
||
| 135 | }, |
||
| 136 | cutoutPercentage: 25 |
||
| 137 | '; |
||
| 138 | $htmlHeadXtra[] = Statistics::getJSChartTemplate($url, $reportType, $reportOptions); |
||
| 139 | break; |
||
| 140 | case 'coursebylanguage': |
||
| 141 | $url = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?a=courses_by_language'; |
||
| 142 | $reportName = 'CountCourseByLanguage'; |
||
| 143 | $reportType = 'pie'; |
||
| 144 | $reportOptions = ' |
||
| 145 | legend: { |
||
| 146 | position: "left" |
||
| 147 | }, |
||
| 148 | title: { |
||
| 149 | text: "'.get_lang($reportName).'", |
||
| 150 | display: true |
||
| 151 | }, |
||
| 152 | cutoutPercentage: 25 |
||
| 153 | '; |
||
| 154 | $htmlHeadXtra[] = Statistics::getJSChartTemplate($url, $reportType, $reportOptions); |
||
| 155 | break; |
||
| 156 | case 'users': |
||
| 157 | $invisible = isset($_GET['count_invisible_courses']) ? intval($_GET['count_invisible_courses']) : null; |
||
| 158 | $urlBase = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?'; |
||
| 159 | $url1 = $urlBase.'a=users&count_invisible='.$invisible; |
||
| 160 | $url2 = $urlBase.'a=users_teachers&count_invisible='.$invisible; |
||
| 161 | $url3 = $urlBase.'a=users_students&count_invisible='.$invisible; |
||
| 162 | $reportName1 = get_lang('NumberOfUsers'); |
||
| 163 | $reportName2 = get_lang('Teachers'); |
||
| 164 | $reportName3 = get_lang('Students'); |
||
| 165 | $reportType = 'pie'; |
||
| 166 | $reportOptions = ' |
||
| 167 | legend: { |
||
| 168 | position: "left" |
||
| 169 | }, |
||
| 170 | title: { |
||
| 171 | text: "%s", |
||
| 172 | display: true |
||
| 173 | }, |
||
| 174 | cutoutPercentage: 25 |
||
| 175 | '; |
||
| 176 | $reportOptions1 = sprintf($reportOptions, $reportName1); |
||
| 177 | $reportOptions2 = sprintf($reportOptions, $reportName2); |
||
| 178 | $reportOptions3 = sprintf($reportOptions, $reportName3); |
||
| 179 | $htmlHeadXtra[] = Statistics::getJSChartTemplate( |
||
| 180 | $url1, |
||
| 181 | $reportType, |
||
| 182 | $reportOptions1, |
||
| 183 | 'canvas1' |
||
| 184 | ); |
||
| 185 | $htmlHeadXtra[] = Statistics::getJSChartTemplate( |
||
| 186 | $url2, |
||
| 187 | $reportType, |
||
| 188 | $reportOptions2, |
||
| 189 | 'canvas2' |
||
| 190 | ); |
||
| 191 | $htmlHeadXtra[] = Statistics::getJSChartTemplate( |
||
| 192 | $url3, |
||
| 193 | $reportType, |
||
| 194 | $reportOptions3, |
||
| 195 | 'canvas3' |
||
| 196 | ); |
||
| 197 | break; |
||
| 198 | case 'users_active': |
||
| 199 | $form = new FormValidator('users_active', 'get', api_get_self().'?report=users_active'); |
||
| 200 | $form->addDateRangePicker( |
||
| 201 | 'daterange', |
||
| 202 | get_lang('DateRange'), |
||
| 203 | true, |
||
| 204 | ['format' => 'YYYY-MM-DD', 'timePicker' => 'false', 'validate_format' => 'Y-m-d'] |
||
| 205 | ); |
||
| 206 | |||
| 207 | $form->addHidden('report', 'users_active'); |
||
| 208 | $form->addButtonFilter(get_lang('Search')); |
||
| 209 | |||
| 210 | $validated = $form->validate() || isset($_REQUEST['daterange']); |
||
| 211 | |||
| 212 | $urlBase = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?'; |
||
| 213 | $dateStart = ''; |
||
| 214 | $dateEnd = ''; |
||
| 215 | if ($validated) { |
||
| 216 | $values = $_REQUEST; |
||
| 217 | $form->setDefaults(['daterange' => Security::remove_XSS($values['daterange'])]); |
||
| 218 | $dateStart = Security::remove_XSS($values['daterange_start']); |
||
| 219 | $dateEnd = Security::remove_XSS($values['daterange_end']); |
||
| 220 | } |
||
| 221 | |||
| 222 | $reportType = 'pie'; |
||
| 223 | $reportOptions = ' |
||
| 224 | legend: { |
||
| 225 | position: "left" |
||
| 226 | }, |
||
| 227 | title: { |
||
| 228 | text: "%s", |
||
| 229 | display: true |
||
| 230 | }, |
||
| 231 | cutoutPercentage: 25 |
||
| 232 | '; |
||
| 233 | |||
| 234 | $reportName1 = get_lang('UsersCreatedInTheSelectedPeriod'); |
||
| 235 | $reportName2 = get_lang('UsersByStatus'); |
||
| 236 | $reportName3 = get_lang('UsersByLanguage'); |
||
| 237 | $reportName4 = get_lang('UsersByTargetLanguage'); |
||
| 238 | $reportName5 = get_lang('UsersByCareer'); |
||
| 239 | $reportName6 = get_lang('UsersByContract'); |
||
| 240 | $reportName7 = get_lang('UsersByCertificate'); |
||
| 241 | $reportName8 = get_lang('UsersByAge'); |
||
| 242 | |||
| 243 | //$url1 = $urlBase.'a=users_active&filter=active&date_start='.$dateStart.'&date_end='.$dateEnd; |
||
| 244 | $url2 = $urlBase.'a=users_active&filter=status&date_start='.$dateStart.'&date_end='.$dateEnd; |
||
| 245 | $url3 = $urlBase.'a=users_active&filter=language&date_start='.$dateStart.'&date_end='.$dateEnd; |
||
| 246 | $url4 = $urlBase.'a=users_active&filter=language_cible&date_start='.$dateStart.'&date_end='.$dateEnd; |
||
| 247 | $url5 = $urlBase.'a=users_active&filter=career&date_start='.$dateStart.'&date_end='.$dateEnd; |
||
| 248 | $url6 = $urlBase.'a=users_active&filter=contract&date_start='.$dateStart.'&date_end='.$dateEnd; |
||
| 249 | $url7 = $urlBase.'a=users_active&filter=certificate&date_start='.$dateStart.'&date_end='.$dateEnd; |
||
| 250 | $url8 = $urlBase.'a=users_active&filter=age&date_start='.$dateStart.'&date_end='.$dateEnd; |
||
| 251 | |||
| 252 | $reportOptions1 = sprintf($reportOptions, $reportName1); |
||
| 253 | $reportOptions2 = sprintf($reportOptions, $reportName2); |
||
| 254 | $reportOptions3 = sprintf($reportOptions, $reportName3); |
||
| 255 | $reportOptions4 = sprintf($reportOptions, $reportName4); |
||
| 256 | $reportOptions5 = sprintf($reportOptions, $reportName5); |
||
| 257 | $reportOptions6 = sprintf($reportOptions, $reportName6); |
||
| 258 | $reportOptions7 = sprintf($reportOptions, $reportName7); |
||
| 259 | $reportOptions8 = sprintf($reportOptions, $reportName8); |
||
| 260 | |||
| 261 | break; |
||
| 262 | case 'session_by_date': |
||
| 263 | $form = new FormValidator('session_by_date', 'get'); |
||
| 264 | $form->addDateRangePicker( |
||
| 265 | 'range', |
||
| 266 | get_lang('DateRange'), |
||
| 267 | true, |
||
| 268 | ['format' => 'YYYY-MM-DD', 'timePicker' => 'false', 'validate_format' => 'Y-m-d'] |
||
| 269 | ); |
||
| 270 | |||
| 271 | if ($sessionStatusAllowed) { |
||
| 272 | $options = SessionManager::getStatusList(); |
||
| 273 | $form->addSelect('status_id', get_lang('SessionStatus'), $options, ['placeholder' => get_lang('All')]); |
||
| 274 | } |
||
| 275 | |||
| 276 | $form->addHidden('report', 'session_by_date'); |
||
| 277 | $form->addButtonSearch(get_lang('Search')); |
||
| 278 | |||
| 279 | $validated = $form->validate() || isset($_REQUEST['range']); |
||
| 280 | if ($validated) { |
||
| 281 | $values = $form->getSubmitValues(); |
||
| 282 | $urlBase = api_get_path(WEB_CODE_PATH).'inc/ajax/statistics.ajax.php?'; |
||
| 283 | $dateStart = null; |
||
| 284 | $dateEnd = null; |
||
| 285 | |||
| 286 | if (isset($values['range_start'])) { |
||
| 287 | $dateStart = Security::remove_XSS($values['range_start']); |
||
| 288 | } |
||
| 289 | if (isset($values['range_end'])) { |
||
| 290 | $dateEnd = Security::remove_XSS($values['range_end']); |
||
| 291 | } |
||
| 292 | |||
| 293 | if (isset($_REQUEST['range_start'])) { |
||
| 294 | $dateStart = Security::remove_XSS($_REQUEST['range_start']); |
||
| 295 | } |
||
| 296 | |||
| 297 | if (isset($_REQUEST['range_end'])) { |
||
| 298 | $dateEnd = Security::remove_XSS($_REQUEST['range_end']); |
||
| 299 | } |
||
| 300 | |||
| 301 | $statusId = isset($_REQUEST['status_id']) ? (int) $_REQUEST['status_id'] : 0; |
||
| 302 | |||
| 303 | $conditions = "&date_start=$dateStart&date_end=$dateEnd&status=$statusId"; |
||
| 304 | |||
| 305 | $url1 = $urlBase.'a=session_by_date&filter=category'.$conditions; |
||
| 306 | $url2 = $urlBase.'a=session_by_date&filter=language'.$conditions; |
||
| 307 | $url3 = $urlBase.'a=session_by_date&filter=status'.$conditions; |
||
| 308 | $url4 = $urlBase.'a=session_by_date&filter=course_in_session'.$conditions; |
||
| 309 | |||
| 310 | $reportName1 = get_lang('SessionsPerCategory'); |
||
| 311 | $reportName2 = get_lang('SessionsPerLanguage'); |
||
| 312 | $reportName3 = get_lang('SessionsPerStatus'); |
||
| 313 | $reportName4 = get_lang('CourseInSession'); |
||
| 314 | |||
| 315 | $reportType = 'pie'; |
||
| 316 | $reportOptions = ' |
||
| 317 | legend: { |
||
| 318 | position: "left" |
||
| 319 | }, |
||
| 320 | title: { |
||
| 321 | text: "%s", |
||
| 322 | display: true |
||
| 323 | }, |
||
| 324 | cutoutPercentage: 25 |
||
| 325 | '; |
||
| 326 | $reportOptions1 = sprintf($reportOptions, $reportName1); |
||
| 327 | $reportOptions2 = sprintf($reportOptions, $reportName2); |
||
| 328 | $reportOptions3 = sprintf($reportOptions, $reportName3); |
||
| 329 | |||
| 330 | $htmlHeadXtra[] = Statistics::getJSChartTemplate( |
||
| 331 | $url1, |
||
| 332 | $reportType, |
||
| 333 | $reportOptions1, |
||
| 334 | 'canvas1' |
||
| 335 | ); |
||
| 336 | $htmlHeadXtra[] = Statistics::getJSChartTemplate( |
||
| 337 | $url2, |
||
| 338 | $reportType, |
||
| 339 | $reportOptions2, |
||
| 340 | 'canvas2' |
||
| 341 | ); |
||
| 342 | |||
| 343 | if ($sessionStatusAllowed) { |
||
| 344 | $htmlHeadXtra[] = Statistics::getJSChartTemplate( |
||
| 345 | $url3, |
||
| 346 | $reportType, |
||
| 347 | $reportOptions3, |
||
| 348 | 'canvas3' |
||
| 349 | ); |
||
| 350 | } |
||
| 351 | |||
| 352 | $reportOptions = ' |
||
| 353 | legend: { |
||
| 354 | position: "left" |
||
| 355 | }, |
||
| 356 | title: { |
||
| 357 | text: "'.$reportName4.'", |
||
| 358 | display: true |
||
| 359 | }, |
||
| 360 | responsive: true, |
||
| 361 | animation: { |
||
| 362 | animateScale: true, |
||
| 363 | animateRotate: true |
||
| 364 | }, |
||
| 365 | cutoutPercentage: 25, |
||
| 366 | tooltips: { |
||
| 367 | callbacks: { |
||
| 368 | label: function(tooltipItem, data) { |
||
| 369 | var dataset = data.datasets[tooltipItem.datasetIndex]; |
||
| 370 | var total = dataset.data.reduce(function(previousValue, currentValue, currentIndex, array) { |
||
| 371 | return previousValue + currentValue; |
||
| 372 | }); |
||
| 373 | |||
| 374 | var label = data.labels[tooltipItem.datasetIndex]; |
||
| 375 | var currentValue = dataset.data[tooltipItem.index]; |
||
| 376 | var percentage = Math.floor(((currentValue/total) * 100)+0.5); |
||
| 377 | |||
| 378 | return label + " " + percentage + "%"; |
||
| 379 | } |
||
| 380 | } |
||
| 381 | } |
||
| 382 | '; |
||
| 383 | |||
| 384 | $htmlHeadXtra[] = Statistics::getJSChartTemplate( |
||
| 385 | $url4, |
||
| 386 | $reportType, |
||
| 387 | $reportOptions, |
||
| 388 | 'canvas4' |
||
| 389 | ); |
||
| 390 | } |
||
| 391 | break; |
||
| 392 | } |
||
| 393 | } |
||
| 394 | |||
| 395 | if ('user_session' === $report) { |
||
| 396 | $htmlHeadXtra[] = api_get_jqgrid_js(); |
||
| 397 | } |
||
| 398 | |||
| 399 | if (isset($_GET['export'])) { |
||
| 400 | ob_start(); |
||
| 401 | } |
||
| 402 | |||
| 403 | $course_categories = Statistics::getCourseCategories(); |
||
| 404 | $content = ''; |
||
| 405 | |||
| 406 | switch ($report) { |
||
| 407 | case 'courses_usage': |
||
| 408 | $form = new FormValidator('courses_usage', 'get'); |
||
| 409 | $nextElement = 0; |
||
| 410 | $currentPage = 0; |
||
| 411 | $start = 0; |
||
| 412 | $pagged = 10; |
||
| 413 | $coursesList = []; |
||
| 414 | $op = []; |
||
| 415 | $today = new DateTime(); |
||
| 416 | $reportPost = $_POST['report'] ?? null; |
||
| 417 | $endDate = $today->format('Y-m-d'); |
||
| 418 | $pag = 0; |
||
| 419 | $fechas = [ |
||
| 420 | 'day' => $today->setTimestamp(strtotime('-1 day'))->format('Y-m-d'), |
||
| 421 | 'week' => $today->setTimestamp(strtotime('-1 week'))->format('Y-m-d'), |
||
| 422 | 'month' => $today->setTimestamp(strtotime('-1 month'))->format('Y-m-d'), |
||
| 423 | '6month' => $today->setTimestamp(strtotime('-6 month'))->format('Y-m-d'), |
||
| 424 | 'year' => $today->setTimestamp(strtotime('-1 year'))->format('Y-m-d'), |
||
| 425 | '2year' => $today->setTimestamp(strtotime('-2 year'))->format('Y-m-d'), |
||
| 426 | 'total' => null, |
||
| 427 | ]; |
||
| 428 | $courses = CourseManager::get_course_list(); |
||
| 429 | $coursesTotal = count($courses); |
||
| 430 | if (0 < $coursesTotal) { |
||
| 431 | $start = isset($_GET['start']) ? (int) ($_GET['start']) : 0; |
||
| 432 | } |
||
| 433 | |||
| 434 | $start = abs($start); |
||
| 435 | |||
| 436 | $termina = ($start + $pagged) < $pagged ? $pagged : $start + $pagged; |
||
| 437 | foreach ($courses as $course) { |
||
| 438 | $courseId = $course['id']; |
||
| 439 | $sessions = 0; |
||
| 440 | $courseTotal = 0; |
||
| 441 | $visit = 0; |
||
| 442 | $indexCourseList = count($coursesList); |
||
| 443 | $item = []; |
||
| 444 | if ($indexCourseList >= $start && $indexCourseList < $termina) { |
||
| 445 | foreach ($fechas as $index => $date) { |
||
| 446 | $startDate = $date; |
||
| 447 | $courseTotal = count(CourseManager::getAccessCourse( |
||
| 448 | $courseId, |
||
| 449 | 0, |
||
| 450 | 0, |
||
| 451 | $startDate, |
||
| 452 | $endDate |
||
| 453 | )); |
||
| 454 | $sessions = count(CourseManager::getAccessCourse( |
||
| 455 | $courseId, |
||
| 456 | 1, |
||
| 457 | 0, |
||
| 458 | $startDate, |
||
| 459 | $endDate |
||
| 460 | )); |
||
| 461 | $visit = count(CourseManager::getAccessCourse( |
||
| 462 | $courseId, |
||
| 463 | 3, |
||
| 464 | 0, |
||
| 465 | $startDate, |
||
| 466 | $endDate |
||
| 467 | )); |
||
| 468 | $temp = [ |
||
| 469 | 'start' => $startDate, |
||
| 470 | 'course' => $visit, |
||
| 471 | 'course_id' => $course['id'], |
||
| 472 | 'session' => $sessions, |
||
| 473 | 'count' => $sessions + $courseTotal, |
||
| 474 | ]; |
||
| 475 | $item[$index] = $temp; |
||
| 476 | } |
||
| 477 | $coursesList[$indexCourseList] = [ |
||
| 478 | $course['title'], |
||
| 479 | $item['day']['count'], |
||
| 480 | $item['week']['count'], |
||
| 481 | $item['month']['count'], |
||
| 482 | $item['6month']['count'], |
||
| 483 | $item['year']['count'], |
||
| 484 | $item['2year']['count'], |
||
| 485 | $courseTotal, |
||
| 486 | $sessions, |
||
| 487 | $item['total']['count'], |
||
| 488 | ]; |
||
| 489 | if (0 == $nextElement) { |
||
| 490 | $nextElement = $indexCourseList; |
||
| 491 | } |
||
| 492 | $op[] = $coursesList[$indexCourseList]; |
||
| 493 | } else { |
||
| 494 | $coursesList[$indexCourseList] = null; |
||
| 495 | } |
||
| 496 | if ($indexCourseList >= ($termina)) { |
||
| 497 | break; |
||
| 498 | } |
||
| 499 | |||
| 500 | if (1 == count($coursesList) % $pagged) { |
||
| 501 | $currentPage++; |
||
| 502 | } |
||
| 503 | } |
||
| 504 | $headerName = [ |
||
| 505 | [get_lang('Course'), false], |
||
| 506 | [get_lang('Today'), false], |
||
| 507 | [get_lang('ThisWeek'), false], |
||
| 508 | [get_lang('ThisMonth'), false], |
||
| 509 | ["6 ".get_lang('MinMonths'), false], |
||
| 510 | ["1 ".get_lang('Year'), false], |
||
| 511 | ["2 ".get_lang('Years'), false], |
||
| 512 | [get_lang('NumAccess')." (".get_lang('Course').")", false], |
||
| 513 | [get_lang('NumAccess')." (".get_lang('Session').")", false], |
||
| 514 | [get_lang('AbsoluteTotal')." (".get_lang('Visited').")", false], |
||
| 515 | ]; |
||
| 516 | $query_vars = []; |
||
| 517 | $query_vars['start'] = $nextElement; |
||
| 518 | $query_vars['report'] = 'courses_usage'; |
||
| 519 | $paging_options = []; |
||
| 520 | $paging_options['per_page'] = $pagged; |
||
| 521 | $nextCourseIndex = ($start + $pagged); |
||
| 522 | $previousCourseIndex = ($start - 10) < 0 ? 0 : ($start - 10); |
||
| 523 | |||
| 524 | $pag = (int) ($coursesTotal / $pagged); |
||
| 525 | if ($pag < ($coursesTotal / $pagged)) { |
||
| 526 | $pag++; |
||
| 527 | } |
||
| 528 | |||
| 529 | $nextLink = Display::url( |
||
| 530 | Display::return_icon( |
||
| 531 | 'action_next.png', |
||
| 532 | get_lang('NextPage'), |
||
| 533 | [], |
||
| 534 | ICON_SIZE_MEDIUM |
||
| 535 | ), |
||
| 536 | api_get_self()."?&start=$nextCourseIndex&report=courses_usage", |
||
| 537 | ['class' => 'btn'] |
||
| 538 | ); |
||
| 539 | |||
| 540 | $previousLink = Display::url( |
||
| 541 | Display::return_icon( |
||
| 542 | 'action_prev.png', |
||
| 543 | get_lang('PreviousPage'), |
||
| 544 | [], |
||
| 545 | ICON_SIZE_MEDIUM |
||
| 546 | ), |
||
| 547 | api_get_self()."?&start=$previousCourseIndex&report=courses_usage", |
||
| 548 | ['class' => 'btn'] |
||
| 549 | ); |
||
| 550 | $table = Display::return_sortable_table( |
||
| 551 | $headerName, |
||
| 552 | $op, |
||
| 553 | 'ASC', |
||
| 554 | $paging_options, |
||
| 555 | $query_vars); |
||
| 556 | |||
| 557 | $form->addHtml( |
||
| 558 | $table |
||
| 559 | ); |
||
| 560 | $html = "<div class='col-md-12 row'><div class='col-md-6'> </div><div class='col-md-6'>"; |
||
| 561 | $html .= ($pag > 1) ? $currentPage." / ".$pag : ''; |
||
| 562 | $html .= ($previousCourseIndex > 1) ? $previousLink : ''; |
||
| 563 | $html .= ($nextCourseIndex < $coursesTotal) ? $nextLink : ''; |
||
| 564 | $html .= '</div>'; |
||
| 565 | $form->addHtml($html); |
||
| 566 | $content = $form->returnForm(); |
||
| 567 | |||
| 568 | break; |
||
| 569 | case 'session_by_date': |
||
| 570 | $sessions = []; |
||
| 571 | if ($validated) { |
||
| 572 | $values = $form->getSubmitValues(); |
||
| 573 | $first = DateTime::createFromFormat('Y-m-d', $dateStart); |
||
| 574 | $second = DateTime::createFromFormat('Y-m-d', $dateEnd); |
||
| 575 | $numberOfWeeks = 0; |
||
| 576 | if ($first) { |
||
| 577 | $numberOfWeeks = floor($first->diff($second)->days / 7); |
||
| 578 | } |
||
| 579 | |||
| 580 | $statusCondition = ''; |
||
| 581 | if (!empty($statusId)) { |
||
| 582 | $statusCondition .= " AND status = $statusId "; |
||
| 583 | } |
||
| 584 | |||
| 585 | $start = Database::escape_string($dateStart); |
||
| 586 | $end = Database::escape_string($dateEnd); |
||
| 587 | |||
| 588 | // User count |
||
| 589 | $tableSession = Database::get_main_table(TABLE_MAIN_SESSION); |
||
| 590 | $sql = "SELECT * FROM $tableSession |
||
| 591 | WHERE |
||
| 592 | (display_start_date BETWEEN '$start' AND '$end' OR |
||
| 593 | display_end_date BETWEEN '$start' AND '$end') |
||
| 594 | $statusCondition |
||
| 595 | "; |
||
| 596 | $result = Database::query($sql); |
||
| 597 | |||
| 598 | $sessionCount = 0; |
||
| 599 | $numberUsers = 0; |
||
| 600 | while ($row = Database::fetch_array($result, 'ASSOC')) { |
||
| 601 | $sessions[] = $row; |
||
| 602 | $numberUsers += $row['nbr_users']; |
||
| 603 | $sessionCount++; |
||
| 604 | } |
||
| 605 | |||
| 606 | // Coach |
||
| 607 | $sql = "SELECT count(DISTINCT(id_coach)) count FROM $tableSession |
||
| 608 | WHERE |
||
| 609 | (display_start_date BETWEEN '$start' AND '$end' OR |
||
| 610 | display_end_date BETWEEN '$start' AND '$end') |
||
| 611 | $statusCondition |
||
| 612 | "; |
||
| 613 | $result = Database::query($sql); |
||
| 614 | $row = Database::fetch_array($result); |
||
| 615 | $uniqueCoaches = $row['count']; |
||
| 616 | |||
| 617 | // Categories |
||
| 618 | $sql = "SELECT count(id) count, session_category_id FROM $tableSession |
||
| 619 | WHERE |
||
| 620 | (display_start_date BETWEEN '$start' AND '$end' OR |
||
| 621 | display_end_date BETWEEN '$start' AND '$end') |
||
| 622 | $statusCondition; |
||
| 623 | GROUP BY session_category_id |
||
| 624 | "; |
||
| 625 | |||
| 626 | $result = Database::query($sql); |
||
| 627 | $sessionPerCategories = []; |
||
| 628 | while ($row = Database::fetch_array($result)) { |
||
| 629 | $sessionPerCategories[$row['session_category_id']] = $row['count']; |
||
| 630 | } |
||
| 631 | |||
| 632 | $sessionAverage = 0; |
||
| 633 | $averageUser = 0; |
||
| 634 | $averageCoach = 0; |
||
| 635 | if (!empty($numberOfWeeks)) { |
||
| 636 | $sessionAverage = api_number_format($sessionCount / $numberOfWeeks, 2); |
||
| 637 | } |
||
| 638 | if (!empty($sessionCount)) { |
||
| 639 | $averageUser = api_number_format($numberUsers / $sessionCount, 2); |
||
| 640 | } |
||
| 641 | if (!empty($uniqueCoaches)) { |
||
| 642 | $averageCoach = api_number_format($sessionCount / $uniqueCoaches, 2); |
||
| 643 | } |
||
| 644 | |||
| 645 | $courseSessions = []; |
||
| 646 | if (!empty($sessions)) { |
||
| 647 | foreach ($sessions as $session) { |
||
| 648 | $courseList = SessionManager::getCoursesInSession($session['id']); |
||
| 649 | foreach ($courseList as $courseId) { |
||
| 650 | if (!isset($courseSessions[$courseId])) { |
||
| 651 | $courseSessions[$courseId] = 0; |
||
| 652 | } |
||
| 653 | $courseSessions[$courseId]++; |
||
| 654 | } |
||
| 655 | } |
||
| 656 | } |
||
| 657 | |||
| 658 | $content .= Display::page_subheader2(get_lang('UsersReportByCourseInSessions')); |
||
| 659 | |||
| 660 | $tableCourse = new HTML_Table(['class' => 'table table-responsive']); |
||
| 661 | $headers = [ |
||
| 662 | get_lang('Course'), |
||
| 663 | get_lang('CountOfSessions'), |
||
| 664 | get_lang('UsersReport'), |
||
| 665 | ]; |
||
| 666 | |||
| 667 | $row = 0; |
||
| 668 | $column = 0; |
||
| 669 | foreach ($headers as $header) { |
||
| 670 | $tableCourse->setHeaderContents($row, $column, $header); |
||
| 671 | $column++; |
||
| 672 | } |
||
| 673 | $row++; |
||
| 674 | |||
| 675 | if (!empty($courseSessions)) { |
||
| 676 | $dateStart = null; |
||
| 677 | $dateEnd = null; |
||
| 678 | if (isset($_REQUEST['range_start'])) { |
||
| 679 | $dateStart = Security::remove_XSS($_REQUEST['range_start']); |
||
| 680 | } |
||
| 681 | if (isset($_REQUEST['range_end'])) { |
||
| 682 | $dateEnd = Security::remove_XSS($_REQUEST['range_end']); |
||
| 683 | } |
||
| 684 | $conditions = "&date_start=$dateStart&date_end=$dateEnd"; |
||
| 685 | arsort($courseSessions); |
||
| 686 | foreach ($courseSessions as $courseId => $count) { |
||
| 687 | $courseInfo = api_get_course_info_by_id($courseId); |
||
| 688 | $tableCourse->setCellContents($row, 0, $courseInfo['name']); |
||
| 689 | $tableCourse->setCellContents($row, 1, $count); |
||
| 690 | $exportLink = api_get_self().'?report=session_by_date&course_id='.$courseId.'&action=export_users'.$conditions; |
||
| 691 | $urlExport = Display::url( |
||
| 692 | Display::return_icon('excel.png', get_lang('UsersReport')), |
||
| 693 | $exportLink |
||
| 694 | ); |
||
| 695 | $tableCourse->setCellContents($row, 2, $urlExport); |
||
| 696 | $row++; |
||
| 697 | } |
||
| 698 | } |
||
| 699 | |||
| 700 | $content .= $tableCourse->toHtml(); |
||
| 701 | |||
| 702 | $content .= Display::page_subheader2(get_lang('GeneralStats')); |
||
| 703 | |||
| 704 | $table = new HTML_Table(['class' => 'table table-responsive']); |
||
| 705 | $row = 0; |
||
| 706 | $table->setCellContents($row, 0, get_lang('Weeks')); |
||
| 707 | $table->setCellContents($row, 1, $numberOfWeeks); |
||
| 708 | $row++; |
||
| 709 | |||
| 710 | $table->setCellContents($row, 0, get_lang('SessionCount')); |
||
| 711 | $table->setCellContents($row, 1, $sessionCount); |
||
| 712 | $row++; |
||
| 713 | |||
| 714 | $table->setCellContents($row, 0, get_lang('SessionsPerWeek')); |
||
| 715 | $table->setCellContents($row, 1, $sessionAverage); |
||
| 716 | $row++; |
||
| 717 | |||
| 718 | $table->setCellContents($row, 0, get_lang('AverageUserPerSession')); |
||
| 719 | $table->setCellContents($row, 1, $averageUser); |
||
| 720 | $row++; |
||
| 721 | |||
| 722 | $table->setCellContents($row, 0, get_lang('AverageSessionPerGeneralCoach')); |
||
| 723 | $table->setCellContents($row, 1, $averageCoach); |
||
| 724 | $row++; |
||
| 725 | |||
| 726 | $content .= $table->toHtml(); |
||
| 727 | |||
| 728 | $content .= '<div class="row">'; |
||
| 729 | $content .= '<div class="col-md-4"><h4 class="page-header" id="canvas1_title"></h4><div id="canvas1_table"></div></div>'; |
||
| 730 | $content .= '<div class="col-md-4"><h4 class="page-header" id="canvas2_title"></h4><div id="canvas2_table"></div></div>'; |
||
| 731 | |||
| 732 | if ($sessionStatusAllowed) { |
||
| 733 | $content .= '<div class="col-md-4"><h4 class="page-header" id="canvas3_title"></h4><div id="canvas3_table"></div></div>'; |
||
| 734 | } |
||
| 735 | $content .= '</div>'; |
||
| 736 | |||
| 737 | $content .= '<div class="row">'; |
||
| 738 | $content .= '<div class="col-md-4"><canvas id="canvas1" style="margin-bottom: 20px"></canvas></div>'; |
||
| 739 | $content .= '<div class="col-md-4"><canvas id="canvas2" style="margin-bottom: 20px"></canvas></div>'; |
||
| 740 | |||
| 741 | if ($sessionStatusAllowed) { |
||
| 742 | $content .= '<div class="col-md-4"><canvas id="canvas3" style="margin-bottom: 20px"></canvas></div>'; |
||
| 743 | } |
||
| 744 | $content .= '</div>'; |
||
| 745 | |||
| 746 | $content .= '<div class="row">'; |
||
| 747 | $content .= '<div class="col-md-12"><canvas id="canvas4" style="margin-bottom: 20px"></canvas></div>'; |
||
| 748 | $content .= '</div>'; |
||
| 749 | } |
||
| 750 | |||
| 751 | $table = new HTML_Table(['class' => 'table table-responsive']); |
||
| 752 | $headers = [ |
||
| 753 | get_lang('Name'), |
||
| 754 | get_lang('StartDate'), |
||
| 755 | get_lang('EndDate'), |
||
| 756 | get_lang('Language'), |
||
| 757 | ]; |
||
| 758 | if ($sessionStatusAllowed) { |
||
| 759 | $headers[] = get_lang('Status'); |
||
| 760 | } |
||
| 761 | $headers[] = get_lang('NumberOfStudents'); |
||
| 762 | $row = 0; |
||
| 763 | $column = 0; |
||
| 764 | foreach ($headers as $header) { |
||
| 765 | $table->setHeaderContents($row, $column, $header); |
||
| 766 | $column++; |
||
| 767 | } |
||
| 768 | $row++; |
||
| 769 | |||
| 770 | foreach ($sessions as $session) { |
||
| 771 | $courseList = SessionManager::getCoursesInSession($session['id']); |
||
| 772 | $table->setCellContents($row, 0, $session['name']); |
||
| 773 | $table->setCellContents($row, 1, api_get_local_time($session['display_start_date'])); |
||
| 774 | $table->setCellContents($row, 2, api_get_local_time($session['display_end_date'])); |
||
| 775 | |||
| 776 | // Get first language. |
||
| 777 | $language = ''; |
||
| 778 | $courses = SessionManager::getCoursesInSession($session['id']); |
||
| 779 | if (!empty($courses)) { |
||
| 780 | $courseId = $courses[0]; |
||
| 781 | $courseInfo = api_get_course_info_by_id($courseId); |
||
| 782 | $language = $courseInfo['language']; |
||
| 783 | $language = get_lang(ucfirst(str_replace(2, '', $language))); |
||
| 784 | } |
||
| 785 | $table->setCellContents($row, 3, $language); |
||
| 786 | |||
| 787 | if ($sessionStatusAllowed) { |
||
| 788 | $table->setCellContents($row, 4, SessionManager::getStatusLabel($session['status'])); |
||
| 789 | } |
||
| 790 | $studentsCount = SessionManager::get_users_by_session($session['id'], 0, true); |
||
| 791 | $table->setCellContents($row, 5, $studentsCount); |
||
| 792 | $row++; |
||
| 793 | } |
||
| 794 | |||
| 795 | $content .= $table->toHtml(); |
||
| 796 | |||
| 797 | if (isset($_REQUEST['action']) && 'export_users' === $_REQUEST['action'] && isset($_REQUEST['course_id'])) { |
||
| 798 | $courseId = intval($_REQUEST['course_id']); |
||
| 799 | $startDate = isset($_REQUEST['date_start']) ? Database::escape_string($_REQUEST['date_start']) : null; |
||
| 800 | $endDate = isset($_REQUEST['date_end']) ? Database::escape_string($_REQUEST['date_end']) : null; |
||
| 801 | |||
| 802 | Statistics::exportUserReportByCourseSession($courseId, $startDate, $endDate); |
||
| 803 | exit; |
||
| 804 | } |
||
| 805 | |||
| 806 | if (isset($_REQUEST['action']) && 'export' === $_REQUEST['action']) { |
||
| 807 | $data = $table->toArray(); |
||
| 808 | Export::arrayToXls($data); |
||
| 809 | exit; |
||
| 810 | } |
||
| 811 | |||
| 812 | $link = ''; |
||
| 813 | if ($validated) { |
||
| 814 | $url = api_get_self().'?report=session_by_date&action=export'; |
||
| 815 | if (!empty($values)) { |
||
| 816 | foreach ($values as $index => $value) { |
||
| 817 | $url .= '&'.$index.'='.$value; |
||
| 818 | } |
||
| 819 | } |
||
| 820 | $link = Display::url( |
||
| 821 | Display::return_icon('excel.png').' '.get_lang('ExportAsXLS'), |
||
| 822 | $url, |
||
| 823 | ['class' => 'btn btn-default'] |
||
| 824 | ); |
||
| 825 | } |
||
| 826 | |||
| 827 | $content = $form->returnForm().$content.$link; |
||
| 828 | |||
| 829 | break; |
||
| 830 | case 'user_session': |
||
| 831 | $form = new FormValidator('user_session', 'get'); |
||
| 832 | $form->addDateRangePicker('range', get_lang('DateRange')); |
||
| 833 | $form->addHidden('report', 'user_session'); |
||
| 834 | $form->addButtonSearch(get_lang('Search')); |
||
| 835 | |||
| 836 | $date = new DateTime('now'); |
||
| 837 | $startDate = $date->format('Y-m-d').' 00:00:00'; |
||
| 838 | $endDate = $date->format('Y-m-d').' 23:59:59'; |
||
| 839 | $start = $startDate; |
||
| 840 | $end = $endDate; |
||
| 841 | |||
| 842 | if ($form->validate()) { |
||
| 843 | $values = $form->getSubmitValues(); |
||
| 844 | $start = $values['range_start']; |
||
| 845 | $end = $values['range_end']; |
||
| 846 | } |
||
| 847 | $content .= $form->returnForm(); |
||
| 848 | |||
| 849 | $url = api_get_path(WEB_AJAX_PATH).'statistics.ajax.php?a=get_user_session&start='.$start.'&end='.$end; |
||
| 850 | $columns = [ |
||
| 851 | 'URL', |
||
| 852 | get_lang('Session'), |
||
| 853 | get_lang('Course'), |
||
| 854 | get_lang('CountUsers'), |
||
| 855 | ]; |
||
| 856 | |||
| 857 | $columnModel = [ |
||
| 858 | [ |
||
| 859 | 'name' => 'url', |
||
| 860 | 'index' => 'url', |
||
| 861 | 'width' => '120', |
||
| 862 | 'align' => 'left', |
||
| 863 | ], |
||
| 864 | [ |
||
| 865 | 'name' => 'session', |
||
| 866 | 'index' => 'session', |
||
| 867 | 'width' => '180', |
||
| 868 | 'align' => 'left', |
||
| 869 | 'sortable' => 'false', |
||
| 870 | ], |
||
| 871 | [ |
||
| 872 | 'name' => 'course', |
||
| 873 | 'index' => 'course', |
||
| 874 | 'width' => '100', |
||
| 875 | 'align' => 'left', |
||
| 876 | 'sortable' => 'false', |
||
| 877 | ], |
||
| 878 | [ |
||
| 879 | 'name' => 'count', |
||
| 880 | 'index' => 'count', |
||
| 881 | 'width' => '50', |
||
| 882 | 'align' => 'left', |
||
| 883 | 'sortable' => 'false', |
||
| 884 | ], |
||
| 885 | ]; |
||
| 886 | $extraParams['autowidth'] = 'true'; //use the width of the parent |
||
| 887 | $extraParams['height'] = 'auto'; //use the width of the parent |
||
| 888 | $actionLinks = ''; |
||
| 889 | |||
| 890 | $content .= ' |
||
| 891 | <script> |
||
| 892 | $(function() { |
||
| 893 | '.Display::grid_js( |
||
| 894 | 'user_session_grid', |
||
| 895 | $url, |
||
| 896 | $columns, |
||
| 897 | $columnModel, |
||
| 898 | $extraParams, |
||
| 899 | [], |
||
| 900 | $actionLinks, |
||
| 901 | true |
||
| 902 | ).'; |
||
| 903 | |||
| 904 | jQuery("#user_session_grid").jqGrid("navGrid","#user_session_grid_pager",{ |
||
| 905 | view:false, |
||
| 906 | edit:false, |
||
| 907 | add:false, |
||
| 908 | del:false, |
||
| 909 | search:false, |
||
| 910 | excel:true |
||
| 911 | }); |
||
| 912 | |||
| 913 | jQuery("#user_session_grid").jqGrid("navButtonAdd","#user_session_grid_pager", { |
||
| 914 | caption:"", |
||
| 915 | onClickButton : function () { |
||
| 916 | jQuery("#user_session_grid").jqGrid("excelExport",{"url":"'.$url.'&export_format=xls"}); |
||
| 917 | } |
||
| 918 | }); |
||
| 919 | }); |
||
| 920 | </script>'; |
||
| 921 | |||
| 922 | $content .= Display::grid_html('user_session_grid'); |
||
| 923 | |||
| 924 | break; |
||
| 925 | case 'courses': |
||
| 926 | $content .= '<canvas class="col-md-12" id="canvas" height="300px" style="margin-bottom: 20px"></canvas>'; |
||
| 927 | // total amount of courses |
||
| 928 | $courses = []; |
||
| 929 | foreach ($course_categories as $code => $name) { |
||
| 930 | $courses[$name] = Statistics::countCourses($code); |
||
| 931 | } |
||
| 932 | // courses for each course category |
||
| 933 | $content .= Statistics::printStats(get_lang('CountCours'), $courses); |
||
| 934 | break; |
||
| 935 | case 'tools': |
||
| 936 | $content .= '<canvas class="col-md-12" id="canvas" height="300px" style="margin-bottom: 20px"></canvas>'; |
||
| 937 | $content .= Statistics::printToolStats(); |
||
| 938 | break; |
||
| 939 | case 'coursebylanguage': |
||
| 940 | $content .= '<canvas class="col-md-12" id="canvas" height="300px" style="margin-bottom: 20px"></canvas>'; |
||
| 941 | $result = Statistics::printCourseByLanguageStats(); |
||
| 942 | $content .= Statistics::printStats(get_lang('CountCourseByLanguage'), $result); |
||
| 943 | break; |
||
| 944 | case 'courselastvisit': |
||
| 945 | $content .= Statistics::printCourseLastVisit(); |
||
| 946 | break; |
||
| 947 | case 'invoicing': |
||
| 948 | if (!empty($invoicingMonth)) { |
||
| 949 | $invoicingMonth = sprintf("%02d", $invoicingMonth); |
||
| 950 | $currentMonth = $invoicingYear.'-'.$invoicingMonth; |
||
| 951 | $lastMonth = date("Y-m", mktime(0, 0, 0, $invoicingMonth, 0, $invoicingYear)); |
||
| 952 | } else { |
||
| 953 | $currentMonth = date("Y-m"); |
||
| 954 | $lastMonth = date("Y-m", strtotime('-1 month')); |
||
| 955 | $invoicingMonth = date('m'); |
||
| 956 | $invoicingYear = date('Y'); |
||
| 957 | } |
||
| 958 | $content .= Statistics::printInvoicingByAccessUrl($currentMonth, $lastMonth, $invoicingMonth, $invoicingYear); |
||
| 959 | break; |
||
| 960 | case 'users_active': |
||
| 961 | $content = ''; |
||
| 962 | if ($validated) { |
||
| 963 | $startDate = $values['daterange_start']; |
||
| 964 | $endDate = $values['daterange_end']; |
||
| 965 | |||
| 966 | $graph = '<div class="row">'; |
||
| 967 | $graph .= '<div class="col-md-4"><canvas id="canvas1" style="margin-bottom: 20px"></canvas></div>'; |
||
| 968 | $graph .= '<div class="col-md-4"><canvas id="canvas2" style="margin-bottom: 20px"></canvas></div>'; |
||
| 969 | $graph .= '<div class="col-md-4"><canvas id="canvas3" style="margin-bottom: 20px"></canvas></div>'; |
||
| 970 | $graph .= '</div>'; |
||
| 971 | |||
| 972 | $graph .= '<div class="row">'; |
||
| 973 | $graph .= '<div class="col-md-6"><canvas id="canvas4" style="margin-bottom: 20px"></canvas></div>'; |
||
| 974 | $graph .= '<div class="col-md-6"><canvas id="canvas8" style="margin-bottom: 20px"></canvas></div>'; |
||
| 975 | $graph .= '</div>'; |
||
| 976 | |||
| 977 | $graph .= '<div class="row">'; |
||
| 978 | $graph .= '<div class="col-md-6"><canvas id="canvas5" style="margin-bottom: 20px"></canvas></div>'; |
||
| 979 | $graph .= '<div class="col-md-6"><canvas id="canvas6" style="margin-bottom: 20px"></canvas></div>'; |
||
| 980 | $graph .= '</div>'; |
||
| 981 | |||
| 982 | $graph .= '<div class="row">'; |
||
| 983 | $graph .= '<div class="col-md-6"><canvas id="canvas7" style="margin-bottom: 20px"></canvas></div>'; |
||
| 984 | $graph .= '</div>'; |
||
| 985 | |||
| 986 | $conditions = []; |
||
| 987 | $extraConditions = ''; |
||
| 988 | if (!empty($startDate) && !empty($endDate)) { |
||
| 989 | // $extraConditions is already cleaned inside the function getUserListExtraConditions |
||
| 990 | $extraConditions .= " AND registration_date BETWEEN '$startDate' AND '$endDate' "; |
||
| 991 | } |
||
| 992 | |||
| 993 | $totalCount = UserManager::getUserListExtraConditions( |
||
| 994 | $conditions, |
||
| 995 | [], |
||
| 996 | false, |
||
| 997 | false, |
||
| 998 | null, |
||
| 999 | $extraConditions, |
||
| 1000 | true |
||
| 1001 | ); |
||
| 1002 | |||
| 1003 | $pagination = 10; |
||
| 1004 | $table = new SortableTableFromArray( |
||
| 1005 | [], |
||
| 1006 | 0, |
||
| 1007 | $pagination, |
||
| 1008 | 'table_users_active', |
||
| 1009 | null, |
||
| 1010 | 'table_users_active' |
||
| 1011 | ); |
||
| 1012 | |||
| 1013 | $table->actionButtons = [ |
||
| 1014 | 'export' => [ |
||
| 1015 | 'label' => get_lang('ExportAsXLS'), |
||
| 1016 | 'icon' => Display::return_icon('excel.png'), |
||
| 1017 | ], |
||
| 1018 | ]; |
||
| 1019 | |||
| 1020 | $first = ($table->page_nr - 1) * $pagination; |
||
| 1021 | $limit = $table->page_nr * $pagination; |
||
| 1022 | |||
| 1023 | $data = []; |
||
| 1024 | $headers = [ |
||
| 1025 | get_lang('FirstName'), |
||
| 1026 | get_lang('LastName'), |
||
| 1027 | get_lang('RegistrationDate'), |
||
| 1028 | get_lang('UserNativeLanguage'), |
||
| 1029 | get_lang('LangueCible'), |
||
| 1030 | get_lang('ApprenticeshipContract'), |
||
| 1031 | get_lang('UserResidenceCountry'), |
||
| 1032 | get_lang('Career'), |
||
| 1033 | get_lang('Status'), |
||
| 1034 | get_lang('Active'), |
||
| 1035 | get_lang('Certificate'), |
||
| 1036 | get_lang('UserBirthday'), |
||
| 1037 | ]; |
||
| 1038 | |||
| 1039 | if (isset($_REQUEST['action_table']) && 'export' === $_REQUEST['action_table']) { |
||
| 1040 | $first = 0; |
||
| 1041 | $limit = $totalCount; |
||
| 1042 | $data[] = $headers; |
||
| 1043 | } |
||
| 1044 | |||
| 1045 | if (isset($_REQUEST['table_users_active_per_page'])) { |
||
| 1046 | $limit = (int) $_REQUEST['table_users_active_per_page']; |
||
| 1047 | } |
||
| 1048 | |||
| 1049 | $users = UserManager::getUserListExtraConditions( |
||
| 1050 | $conditions, |
||
| 1051 | [], |
||
| 1052 | $first, |
||
| 1053 | $limit, |
||
| 1054 | null, |
||
| 1055 | $extraConditions |
||
| 1056 | ); |
||
| 1057 | |||
| 1058 | $extraFieldValueUser = new ExtraFieldValue('user'); |
||
| 1059 | foreach ($users as $user) { |
||
| 1060 | $userId = $user['user_id']; |
||
| 1061 | $userInfo = api_get_user_info($userId); |
||
| 1062 | |||
| 1063 | $extraDataList = $extraFieldValueUser->getAllValuesByItem($userId); |
||
| 1064 | $extraFields = []; |
||
| 1065 | foreach ($extraDataList as $extraData) { |
||
| 1066 | $extraFields[$extraData['variable']] = $extraData['value']; |
||
| 1067 | } |
||
| 1068 | |||
| 1069 | $certificate = GradebookUtils::get_certificate_by_user_id(0, $userId); |
||
| 1070 | $language = $extraFields['langue_cible'] ?? ''; |
||
| 1071 | //$contract = isset($extraFields['termactivated']) ? $extraFields['termactivated'] : ''; |
||
| 1072 | $contract = false; |
||
| 1073 | $legalAccept = $extraFieldValueUser->get_values_by_handler_and_field_variable($userId, 'legal_accept'); |
||
| 1074 | if ($legalAccept && !empty($legalAccept['value'])) { |
||
| 1075 | list($legalId, $legalLanguageId, $legalTime) = explode(':', $legalAccept['value']); |
||
| 1076 | if ($legalId) { |
||
| 1077 | $contract = true; |
||
| 1078 | } |
||
| 1079 | } |
||
| 1080 | |||
| 1081 | $residence = $extraFields['terms_paysresidence'] ?? ''; |
||
| 1082 | $career = $extraFields['filiere_user'] ?? ''; |
||
| 1083 | $birthDate = $extraFields['terms_datedenaissance'] ?? ''; |
||
| 1084 | |||
| 1085 | $userLanguage = ''; |
||
| 1086 | if (!empty($user['language'])) { |
||
| 1087 | $userLanguage = get_lang(ucfirst(str_replace(2, '', $user['language']))); |
||
| 1088 | } |
||
| 1089 | |||
| 1090 | $languageTarget = ''; |
||
| 1091 | if (!empty($language)) { |
||
| 1092 | $languageTarget = get_lang(ucfirst(str_replace(2, '', strtolower($language)))); |
||
| 1093 | } |
||
| 1094 | |||
| 1095 | $item = []; |
||
| 1096 | $item[] = $user['firstname']; |
||
| 1097 | $item[] = $user['lastname']; |
||
| 1098 | $item[] = api_get_local_time($user['registration_date']); |
||
| 1099 | $item[] = $userLanguage; |
||
| 1100 | $item[] = $languageTarget; |
||
| 1101 | $item[] = $contract ? get_lang('Yes') : get_lang('No'); |
||
| 1102 | $item[] = $residence; |
||
| 1103 | $item[] = $career; |
||
| 1104 | $item[] = $userInfo['icon_status_label']; |
||
| 1105 | $item[] = 1 == $user['active'] ? get_lang('Yes') : get_lang('No'); |
||
| 1106 | $item[] = $certificate ? get_lang('Yes') : get_lang('No'); |
||
| 1107 | $item[] = $birthDate; |
||
| 1108 | $data[] = $item; |
||
| 1109 | } |
||
| 1110 | |||
| 1111 | if (isset($_REQUEST['action_table']) && 'export' === $_REQUEST['action_table']) { |
||
| 1112 | Export::arrayToXls($data); |
||
| 1113 | exit; |
||
| 1114 | } |
||
| 1115 | |||
| 1116 | $table->total_number_of_items = $totalCount; |
||
| 1117 | $table->table_data = $data; |
||
| 1118 | unset($values['submit']); |
||
| 1119 | $table->set_additional_parameters($values); |
||
| 1120 | $table->handlePagination = true; |
||
| 1121 | |||
| 1122 | $row = 0; |
||
| 1123 | $column = 0; |
||
| 1124 | foreach ($headers as $header) { |
||
| 1125 | $table->set_header($column, $header, false); |
||
| 1126 | $column++; |
||
| 1127 | } |
||
| 1128 | |||
| 1129 | $studentCount = UserManager::getUserListExtraConditions( |
||
| 1130 | ['status' => STUDENT], |
||
| 1131 | null, |
||
| 1132 | null, |
||
| 1133 | null, |
||
| 1134 | null, |
||
| 1135 | null, |
||
| 1136 | true |
||
| 1137 | ); |
||
| 1138 | $content .= $table->return_table(); |
||
| 1139 | |||
| 1140 | $conditions = ['active' => 1]; |
||
| 1141 | $active = UserManager::getUserListExtraConditions( |
||
| 1142 | $conditions, |
||
| 1143 | [], |
||
| 1144 | false, |
||
| 1145 | false, |
||
| 1146 | null, |
||
| 1147 | $extraConditions, |
||
| 1148 | true |
||
| 1149 | ); |
||
| 1150 | $conditions = ['active' => 0]; |
||
| 1151 | $noActive = UserManager::getUserListExtraConditions( |
||
| 1152 | $conditions, |
||
| 1153 | [], |
||
| 1154 | false, |
||
| 1155 | false, |
||
| 1156 | null, |
||
| 1157 | $extraConditions, |
||
| 1158 | true |
||
| 1159 | ); |
||
| 1160 | |||
| 1161 | $all = [ |
||
| 1162 | get_lang('Active') => $active, |
||
| 1163 | get_lang('Inactive') => $noActive, |
||
| 1164 | ]; |
||
| 1165 | |||
| 1166 | $data = Statistics::buildJsChartData($all, $reportName1); |
||
| 1167 | $htmlHeadXtra[] = Statistics::getJSChartTemplateWithData( |
||
| 1168 | $data['chart'], |
||
| 1169 | 'pie', |
||
| 1170 | $reportOptions1, |
||
| 1171 | 'canvas1' |
||
| 1172 | ); |
||
| 1173 | |||
| 1174 | $scoreDisplay = ScoreDisplay::instance(); |
||
| 1175 | $table = new HTML_Table(['class' => 'table table-hover table-striped data_table']); |
||
| 1176 | $headers = [ |
||
| 1177 | get_lang('Name'), |
||
| 1178 | get_lang('Count'), |
||
| 1179 | get_lang('Percentage'), |
||
| 1180 | ]; |
||
| 1181 | $row = 0; |
||
| 1182 | $column = 0; |
||
| 1183 | foreach ($headers as $header) { |
||
| 1184 | $table->setHeaderContents($row, $column, $header); |
||
| 1185 | $column++; |
||
| 1186 | } |
||
| 1187 | |||
| 1188 | $row++; |
||
| 1189 | $table->setCellContents($row, 0, get_lang('Total')); |
||
| 1190 | $table->setCellContents($row, 1, $totalCount); |
||
| 1191 | $table->setCellContents($row, 2, '100 %'); |
||
| 1192 | |||
| 1193 | $row++; |
||
| 1194 | $total = 0; |
||
| 1195 | foreach ($all as $name => $value) { |
||
| 1196 | $total += $value; |
||
| 1197 | } |
||
| 1198 | foreach ($all as $name => $value) { |
||
| 1199 | $percentage = $scoreDisplay->display_score([$value, $total], SCORE_PERCENT); |
||
| 1200 | $table->setCellContents($row, 0, $name); |
||
| 1201 | $table->setCellContents($row, 1, $value); |
||
| 1202 | $table->setCellContents($row, 2, $percentage); |
||
| 1203 | $row++; |
||
| 1204 | } |
||
| 1205 | $extraTables = Display::page_subheader2($reportName1).$table->toHtml(); |
||
| 1206 | |||
| 1207 | // graph 2 |
||
| 1208 | $extraFieldValueUser = new ExtraField('user'); |
||
| 1209 | $extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('statusocial'); |
||
| 1210 | |||
| 1211 | if ($extraField) { |
||
| 1212 | $users = UserManager::getUserListExtraConditions( |
||
| 1213 | [], |
||
| 1214 | [], |
||
| 1215 | false, |
||
| 1216 | false, |
||
| 1217 | null, |
||
| 1218 | $extraConditions |
||
| 1219 | ); |
||
| 1220 | |||
| 1221 | $userIdList = array_column($users, 'user_id'); |
||
| 1222 | $userIdListToString = implode("', '", $userIdList); |
||
| 1223 | |||
| 1224 | $all = []; |
||
| 1225 | $total = count($users); |
||
| 1226 | $usersFound = 0; |
||
| 1227 | |||
| 1228 | $extraFieldOption = new ExtraFieldOption('user'); |
||
| 1229 | foreach ($extraField['options'] as $item) { |
||
| 1230 | $value = Database::escape_string($item['option_value']); |
||
| 1231 | $count = 0; |
||
| 1232 | $sql = "SELECT count(id) count |
||
| 1233 | FROM $extraFieldValueUser->table_field_values |
||
| 1234 | WHERE |
||
| 1235 | value = '$value' AND |
||
| 1236 | item_id IN ('$userIdListToString') AND |
||
| 1237 | field_id = ".$extraField['id']; |
||
| 1238 | $query = Database::query($sql); |
||
| 1239 | $result = Database::fetch_array($query); |
||
| 1240 | $count = $result['count']; |
||
| 1241 | $usersFound += $count; |
||
| 1242 | |||
| 1243 | $option = $extraFieldOption->get($item['id']); |
||
| 1244 | $item['display_text'] = $option['display_text']; |
||
| 1245 | $all[$item['display_text']] = $count; |
||
| 1246 | } |
||
| 1247 | $all[get_lang('N/A')] = $total - $usersFound; |
||
| 1248 | |||
| 1249 | $data = Statistics::buildJsChartData($all, $reportName2); |
||
| 1250 | $htmlHeadXtra[] = Statistics::getJSChartTemplateWithData( |
||
| 1251 | $data['chart'], |
||
| 1252 | 'pie', |
||
| 1253 | $reportOptions2, |
||
| 1254 | 'canvas2' |
||
| 1255 | ); |
||
| 1256 | $extraTables .= $data['table']; |
||
| 1257 | } |
||
| 1258 | |||
| 1259 | // graph 3 |
||
| 1260 | $languages = api_get_languages(); |
||
| 1261 | $all = []; |
||
| 1262 | foreach ($languages['folder'] as $language) { |
||
| 1263 | $conditions = ['language' => $language]; |
||
| 1264 | $key = $language; |
||
| 1265 | if ('2' === substr($language, -1)) { |
||
| 1266 | $key = str_replace(2, '', $language); |
||
| 1267 | } |
||
| 1268 | |||
| 1269 | $key = get_lang(ucfirst($key)); |
||
| 1270 | if (!isset($all[$key])) { |
||
| 1271 | $all[$key] = 0; |
||
| 1272 | } |
||
| 1273 | $all[$key] += UserManager::getUserListExtraConditions( |
||
| 1274 | $conditions, |
||
| 1275 | [], |
||
| 1276 | false, |
||
| 1277 | false, |
||
| 1278 | null, |
||
| 1279 | $extraConditions, |
||
| 1280 | true |
||
| 1281 | ); |
||
| 1282 | } |
||
| 1283 | |||
| 1284 | $data = Statistics::buildJsChartData($all, $reportName3); |
||
| 1285 | $htmlHeadXtra[] = Statistics::getJSChartTemplateWithData( |
||
| 1286 | $data['chart'], |
||
| 1287 | 'pie', |
||
| 1288 | $reportOptions3, |
||
| 1289 | 'canvas3' |
||
| 1290 | ); |
||
| 1291 | $extraTables .= $data['table']; |
||
| 1292 | |||
| 1293 | // graph 4 |
||
| 1294 | $extraFieldValueUser = new ExtraField('user'); |
||
| 1295 | $extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('langue_cible'); |
||
| 1296 | if ($extraField) { |
||
| 1297 | $users = UserManager::getUserListExtraConditions( |
||
| 1298 | [], |
||
| 1299 | [], |
||
| 1300 | false, |
||
| 1301 | false, |
||
| 1302 | null, |
||
| 1303 | $extraConditions |
||
| 1304 | ); |
||
| 1305 | |||
| 1306 | $userIdList = array_column($users, 'user_id'); |
||
| 1307 | $userIdListToString = implode("', '", $userIdList); |
||
| 1308 | |||
| 1309 | $all = []; |
||
| 1310 | $total = count($users); |
||
| 1311 | $usersFound = 0; |
||
| 1312 | foreach ($extraField['options'] as $item) { |
||
| 1313 | $value = Database::escape_string($item['option_value']); |
||
| 1314 | $count = 0; |
||
| 1315 | $sql = "SELECT count(id) count |
||
| 1316 | FROM $extraFieldValueUser->table_field_values |
||
| 1317 | WHERE |
||
| 1318 | value = '$value' AND |
||
| 1319 | item_id IN ('$userIdListToString') AND |
||
| 1320 | field_id = ".$extraField['id']; |
||
| 1321 | $query = Database::query($sql); |
||
| 1322 | $result = Database::fetch_array($query); |
||
| 1323 | $count = $result['count']; |
||
| 1324 | $usersFound += $count; |
||
| 1325 | |||
| 1326 | $item['display_text'] = get_lang(ucfirst(str_replace('2', '', strtolower($item['display_text'])))); |
||
| 1327 | $all[$item['display_text']] = $count; |
||
| 1328 | } |
||
| 1329 | $all[get_lang('N/A')] = $total - $usersFound; |
||
| 1330 | |||
| 1331 | $data = Statistics::buildJsChartData($all, $reportName4); |
||
| 1332 | $htmlHeadXtra[] = Statistics::getJSChartTemplateWithData( |
||
| 1333 | $data['chart'], |
||
| 1334 | 'pie', |
||
| 1335 | $reportOptions4, |
||
| 1336 | 'canvas4' |
||
| 1337 | ); |
||
| 1338 | $extraTables .= $data['table']; |
||
| 1339 | } |
||
| 1340 | |||
| 1341 | // Graph Age |
||
| 1342 | $extraFieldValueUser = new ExtraField('user'); |
||
| 1343 | $extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('terms_datedenaissance'); |
||
| 1344 | if ($extraField) { |
||
| 1345 | $users = UserManager::getUserListExtraConditions( |
||
| 1346 | [], |
||
| 1347 | [], |
||
| 1348 | false, |
||
| 1349 | false, |
||
| 1350 | null, |
||
| 1351 | $extraConditions |
||
| 1352 | ); |
||
| 1353 | |||
| 1354 | $userIdList = array_column($users, 'user_id'); |
||
| 1355 | $userIdListToString = implode("', '", $userIdList); |
||
| 1356 | |||
| 1357 | $all = []; |
||
| 1358 | $total = count($users); |
||
| 1359 | |||
| 1360 | $sql = "SELECT value |
||
| 1361 | FROM $extraFieldValueUser->table_field_values |
||
| 1362 | WHERE |
||
| 1363 | item_id IN ('$userIdListToString') AND |
||
| 1364 | field_id = ".$extraField['id']; |
||
| 1365 | $query = Database::query($sql); |
||
| 1366 | $usersFound = 0; |
||
| 1367 | $now = new DateTime(); |
||
| 1368 | $all = [ |
||
| 1369 | //get_lang('N/A') => 0, |
||
| 1370 | '16-17' => 0, |
||
| 1371 | '18-25' => 0, |
||
| 1372 | '26-30' => 0, |
||
| 1373 | ]; |
||
| 1374 | |||
| 1375 | while ($row = Database::fetch_array($query)) { |
||
| 1376 | $usersFound++; |
||
| 1377 | if (!empty($row['value'])) { |
||
| 1378 | $validDate = DateTime::createFromFormat('Y-m-d', $row['value']); |
||
| 1379 | $validDate = $validDate && $validDate->format('Y-m-d') === $row['value']; |
||
| 1380 | if ($validDate) { |
||
| 1381 | $date1 = new DateTime($row['value']); |
||
| 1382 | $interval = $now->diff($date1); |
||
| 1383 | $years = $interval->y; |
||
| 1384 | |||
| 1385 | if ($years >= 16 && $years <= 17) { |
||
| 1386 | $all['16-17']++; |
||
| 1387 | } |
||
| 1388 | if ($years >= 18 && $years <= 25) { |
||
| 1389 | $all['18-25']++; |
||
| 1390 | } |
||
| 1391 | if ($years >= 26 && $years <= 30) { |
||
| 1392 | $all['26-30']++; |
||
| 1393 | } |
||
| 1394 | } |
||
| 1395 | } |
||
| 1396 | } |
||
| 1397 | |||
| 1398 | $data = Statistics::buildJsChartData($all, $reportName8); |
||
| 1399 | $htmlHeadXtra[] = Statistics::getJSChartTemplateWithData( |
||
| 1400 | $data['chart'], |
||
| 1401 | 'pie', |
||
| 1402 | $reportOptions8, |
||
| 1403 | 'canvas8' |
||
| 1404 | ); |
||
| 1405 | $extraTables .= $data['table']; |
||
| 1406 | } |
||
| 1407 | |||
| 1408 | // graph 5 |
||
| 1409 | $extraFieldValueUser = new ExtraField('user'); |
||
| 1410 | $extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('filiere_user'); |
||
| 1411 | if ($extraField) { |
||
| 1412 | $all = []; |
||
| 1413 | $users = UserManager::getUserListExtraConditions( |
||
| 1414 | [], |
||
| 1415 | [], |
||
| 1416 | false, |
||
| 1417 | false, |
||
| 1418 | null, |
||
| 1419 | $extraConditions |
||
| 1420 | ); |
||
| 1421 | |||
| 1422 | $userIdList = array_column($users, 'user_id'); |
||
| 1423 | $userIdListToString = implode("', '", $userIdList); |
||
| 1424 | $usersFound = 0; |
||
| 1425 | |||
| 1426 | $total = count($users); |
||
| 1427 | $extraFieldOption = new ExtraFieldOption('user'); |
||
| 1428 | foreach ($extraField['options'] as $item) { |
||
| 1429 | $value = Database::escape_string($item['option_value']); |
||
| 1430 | $count = 0; |
||
| 1431 | $sql = "SELECT count(id) count |
||
| 1432 | FROM $extraFieldValueUser->table_field_values |
||
| 1433 | WHERE |
||
| 1434 | value = '$value' AND |
||
| 1435 | item_id IN ('$userIdListToString') AND |
||
| 1436 | field_id = ".$extraField['id']; |
||
| 1437 | $query = Database::query($sql); |
||
| 1438 | $result = Database::fetch_array($query); |
||
| 1439 | $count = $result['count']; |
||
| 1440 | $option = $extraFieldOption->get($item['id']); |
||
| 1441 | $item['display_text'] = $option['display_text']; |
||
| 1442 | $all[$item['display_text']] = $count; |
||
| 1443 | $usersFound += $count; |
||
| 1444 | } |
||
| 1445 | |||
| 1446 | $all[get_lang('N/A')] = $total - $usersFound; |
||
| 1447 | |||
| 1448 | $data = Statistics::buildJsChartData($all, $reportName5); |
||
| 1449 | $htmlHeadXtra[] = Statistics::getJSChartTemplateWithData( |
||
| 1450 | $data['chart'], |
||
| 1451 | 'pie', |
||
| 1452 | $reportOptions5, |
||
| 1453 | 'canvas5' |
||
| 1454 | ); |
||
| 1455 | $extraTables .= $data['table']; |
||
| 1456 | } |
||
| 1457 | |||
| 1458 | // graph 6 |
||
| 1459 | $extraFieldValueUser = new ExtraField('user'); |
||
| 1460 | $extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('termactivated'); |
||
| 1461 | if ($extraField) { |
||
| 1462 | $users = UserManager::getUserListExtraConditions( |
||
| 1463 | [], |
||
| 1464 | [], |
||
| 1465 | false, |
||
| 1466 | false, |
||
| 1467 | null, |
||
| 1468 | $extraConditions |
||
| 1469 | ); |
||
| 1470 | |||
| 1471 | $userIdList = array_column($users, 'user_id'); |
||
| 1472 | $userIdListToString = implode("', '", $userIdList); |
||
| 1473 | |||
| 1474 | $all = []; |
||
| 1475 | $total = count($users); |
||
| 1476 | $sql = "SELECT count(id) count |
||
| 1477 | FROM $extraFieldValueUser->table_field_values |
||
| 1478 | WHERE |
||
| 1479 | value = 1 AND |
||
| 1480 | item_id IN ('$userIdListToString') AND |
||
| 1481 | field_id = ".$extraField['id']; |
||
| 1482 | $query = Database::query($sql); |
||
| 1483 | $result = Database::fetch_array($query); |
||
| 1484 | $count = $result['count']; |
||
| 1485 | |||
| 1486 | $all[get_lang('Yes')] = $count; |
||
| 1487 | $all[get_lang('No')] = $total - $count; |
||
| 1488 | |||
| 1489 | $data = Statistics::buildJsChartData($all, $reportName6); |
||
| 1490 | $htmlHeadXtra[] = Statistics::getJSChartTemplateWithData( |
||
| 1491 | $data['chart'], |
||
| 1492 | 'pie', |
||
| 1493 | $reportOptions6, |
||
| 1494 | 'canvas6' |
||
| 1495 | ); |
||
| 1496 | $extraTables .= $data['table']; |
||
| 1497 | } |
||
| 1498 | |||
| 1499 | // Graph 7 |
||
| 1500 | $extraFieldValueUser = new ExtraField('user'); |
||
| 1501 | $extraField = $extraFieldValueUser->get_handler_field_info_by_field_variable('langue_cible'); |
||
| 1502 | if ($extraField) { |
||
| 1503 | $users = UserManager::getUserListExtraConditions( |
||
| 1504 | [], |
||
| 1505 | [], |
||
| 1506 | false, |
||
| 1507 | false, |
||
| 1508 | null, |
||
| 1509 | $extraConditions |
||
| 1510 | ); |
||
| 1511 | |||
| 1512 | $total = count($users); |
||
| 1513 | $userIdList = array_column($users, 'user_id'); |
||
| 1514 | $certificateCount = 0; |
||
| 1515 | foreach ($userIdList as $userId) { |
||
| 1516 | $certificate = GradebookUtils::get_certificate_by_user_id( |
||
| 1517 | 0, |
||
| 1518 | $userId |
||
| 1519 | ); |
||
| 1520 | |||
| 1521 | if (!empty($certificate)) { |
||
| 1522 | $certificateCount++; |
||
| 1523 | } |
||
| 1524 | } |
||
| 1525 | |||
| 1526 | $all[get_lang('Yes')] = $certificateCount; |
||
| 1527 | $all[get_lang('No')] = $total - $certificateCount; |
||
| 1528 | |||
| 1529 | $data = Statistics::buildJsChartData($all, $reportName7); |
||
| 1530 | $htmlHeadXtra[] = Statistics::getJSChartTemplateWithData( |
||
| 1531 | $data['chart'], |
||
| 1532 | 'pie', |
||
| 1533 | $reportOptions7, |
||
| 1534 | 'canvas7' |
||
| 1535 | ); |
||
| 1536 | $extraTables .= $data['table']; |
||
| 1537 | } |
||
| 1538 | |||
| 1539 | $header = Display::page_subheader2(get_lang('TotalNumberOfStudents').': '.$studentCount); |
||
| 1540 | $content = $header.$extraTables.$graph.$content; |
||
| 1541 | } |
||
| 1542 | |||
| 1543 | $content = $form->returnForm().$content; |
||
| 1544 | |||
| 1545 | break; |
||
| 1546 | case 'users_online': |
||
| 1547 | $table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_ATTEMPT); |
||
| 1548 | $intervals = [3, 5, 30, 120]; |
||
| 1549 | $counts = []; |
||
| 1550 | foreach ($intervals as $minutes) { |
||
| 1551 | $sql = "SELECT count(distinct(user_id)) |
||
| 1552 | FROM $table WHERE |
||
| 1553 | tms > DATE_SUB(UTC_TIMESTAMP(), INTERVAL '$minutes' MINUTE)"; |
||
| 1554 | $query = Database::query($sql); |
||
| 1555 | $counts[$minutes] = 0; |
||
| 1556 | if (Database::num_rows($query) > 0) { |
||
| 1557 | $row = Database::fetch_array($query); |
||
| 1558 | $counts[$minutes] = $row[0]; |
||
| 1559 | } |
||
| 1560 | } |
||
| 1561 | $content = '<div class="pull-left">'.get_lang('UsersOnline').'</div> |
||
| 1562 | <div class="pull-right">'.api_get_local_time().'</div> |
||
| 1563 | <hr /> |
||
| 1564 | <div class="tracking-course-summary"> |
||
| 1565 | <div class="row"> |
||
| 1566 | <div class="col-lg-3 col-sm-3"> |
||
| 1567 | <div class="panel panel-default tracking tracking-exercise"> |
||
| 1568 | <div class="panel-body"> |
||
| 1569 | <span class="tracking-icon"> |
||
| 1570 | <i class="fa fa-thermometer-4" aria-hidden="true"></i> |
||
| 1571 | </span> |
||
| 1572 | <div class="tracking-info"> |
||
| 1573 | <div class="tracking-text">'.get_lang('UsersOnline').' (3\')</div> |
||
| 1574 | <div class="tracking-number">'.getOnlineUsersCount(3).'</div> |
||
| 1575 | </div> |
||
| 1576 | </div> |
||
| 1577 | </div> |
||
| 1578 | </div> |
||
| 1579 | <div class="col-lg-3 col-sm-3"> |
||
| 1580 | <div class="panel panel-default tracking tracking-certificate"> |
||
| 1581 | <div class="panel-body"> |
||
| 1582 | <span class="tracking-icon"> |
||
| 1583 | <i class="fa fa-thermometer-3" aria-hidden="true"></i> |
||
| 1584 | </span> |
||
| 1585 | <div class="tracking-info"> |
||
| 1586 | <div class="tracking-text">'.get_lang('UsersOnline').' (5\')</div> |
||
| 1587 | <div class="tracking-number">'.getOnlineUsersCount(5).'</div> |
||
| 1588 | </div> |
||
| 1589 | </div> |
||
| 1590 | </div> |
||
| 1591 | </div> |
||
| 1592 | <div class="col-lg-3 col-sm-3"> |
||
| 1593 | <div class="panel panel-default tracking tracking-lessons"> |
||
| 1594 | <div class="panel-body"> |
||
| 1595 | <span class="tracking-icon"> |
||
| 1596 | <i class="fa fa-thermometer-2" aria-hidden="true"></i> |
||
| 1597 | </span> |
||
| 1598 | <div class="tracking-info"> |
||
| 1599 | <div class="tracking-text">'.get_lang('UsersOnline').' (30\')</div> |
||
| 1600 | <div class="tracking-number">'.getOnlineUsersCount(30).'</div> |
||
| 1601 | </div> |
||
| 1602 | </div> |
||
| 1603 | </div> |
||
| 1604 | </div> |
||
| 1605 | <div class="col-lg-3 col-sm-3"> |
||
| 1606 | <div class="panel panel-default tracking tracking-student"> |
||
| 1607 | <div class="panel-body"> |
||
| 1608 | <span class="tracking-icon"> |
||
| 1609 | <i class="fa fa-thermometer-1" aria-hidden="true"></i> |
||
| 1610 | </span> |
||
| 1611 | <div class="tracking-info"> |
||
| 1612 | <div class="tracking-text">'.get_lang('UsersOnline').' (120\')</div> |
||
| 1613 | <div class="tracking-number">'.getOnlineUsersCount(120).'</div> |
||
| 1614 | </div> |
||
| 1615 | </div> |
||
| 1616 | </div> |
||
| 1617 | </div> |
||
| 1618 | </div> |
||
| 1619 | <div class="pull-left">'.get_lang('UsersActiveInATest').'</div> |
||
| 1620 | <hr /> |
||
| 1621 | <div class="row"> |
||
| 1622 | <div class="col-lg-3 col-sm-3"> |
||
| 1623 | <div class="panel panel-default tracking tracking-exercise"> |
||
| 1624 | <div class="panel-body"> |
||
| 1625 | <span class="tracking-icon"> |
||
| 1626 | <i class="fa fa-thermometer-4" aria-hidden="true"></i> |
||
| 1627 | </span> |
||
| 1628 | <div class="tracking-info"> |
||
| 1629 | <div class="tracking-text">(3\')</div> |
||
| 1630 | <div class="tracking-number">'.$counts[3].'</div> |
||
| 1631 | </div> |
||
| 1632 | </div> |
||
| 1633 | </div> |
||
| 1634 | </div> |
||
| 1635 | <div class="col-lg-3 col-sm-3"> |
||
| 1636 | <div class="panel panel-default tracking tracking-certificate"> |
||
| 1637 | <div class="panel-body"> |
||
| 1638 | <span class="tracking-icon"> |
||
| 1639 | <i class="fa fa-thermometer-3" aria-hidden="true"></i> |
||
| 1640 | </span> |
||
| 1641 | <div class="tracking-info"> |
||
| 1642 | <div class="tracking-text">(5\')</div> |
||
| 1643 | <div class="tracking-number">'.$counts[5].'</div> |
||
| 1644 | </div> |
||
| 1645 | </div> |
||
| 1646 | </div> |
||
| 1647 | </div> |
||
| 1648 | <div class="col-lg-3 col-sm-3"> |
||
| 1649 | <div class="panel panel-default tracking tracking-lessons"> |
||
| 1650 | <div class="panel-body"> |
||
| 1651 | <span class="tracking-icon"> |
||
| 1652 | <i class="fa fa-thermometer-2" aria-hidden="true"></i> |
||
| 1653 | </span> |
||
| 1654 | <div class="tracking-info"> |
||
| 1655 | <div class="tracking-text">(30\')</div> |
||
| 1656 | <div class="tracking-number">'.$counts[30].'</div> |
||
| 1657 | </div> |
||
| 1658 | </div> |
||
| 1659 | </div> |
||
| 1660 | </div> |
||
| 1661 | <div class="col-lg-3 col-sm-3"> |
||
| 1662 | <div class="panel panel-default tracking tracking-student"> |
||
| 1663 | <div class="panel-body"> |
||
| 1664 | <span class="tracking-icon"> |
||
| 1665 | <i class="fa fa-thermometer-1" aria-hidden="true"></i> |
||
| 1666 | </span> |
||
| 1667 | <div class="tracking-info"> |
||
| 1668 | <div class="tracking-text">(120\')</div> |
||
| 1669 | <div class="tracking-number">'.$counts[120].'</div> |
||
| 1670 | </div> |
||
| 1671 | </div> |
||
| 1672 | </div> |
||
| 1673 | </div> |
||
| 1674 | |||
| 1675 | </div>'; |
||
| 1676 | break; |
||
| 1677 | case 'users': |
||
| 1678 | $content .= '<div class="row">'; |
||
| 1679 | $content .= '<div class="col-md-4"><canvas id="canvas1" style="margin-bottom: 20px"></canvas></div>'; |
||
| 1680 | $content .= '<div class="col-md-4"><canvas id="canvas2" style="margin-bottom: 20px"></canvas></div>'; |
||
| 1681 | $content .= '<div class="col-md-4"><canvas id="canvas3" style="margin-bottom: 20px"></canvas></div>'; |
||
| 1682 | |||
| 1683 | $content .= '</div>'; |
||
| 1684 | // total amount of users |
||
| 1685 | $teachers = $students = []; |
||
| 1686 | $countInvisible = isset($_GET['count_invisible_courses']) ? intval($_GET['count_invisible_courses']) : null; |
||
| 1687 | $content .= Statistics::printStats( |
||
| 1688 | get_lang('NumberOfUsers'), |
||
| 1689 | [ |
||
| 1690 | get_lang('Teachers') => Statistics::countUsers(COURSEMANAGER, null, $countInvisible), |
||
| 1691 | get_lang('Students') => Statistics::countUsers(STUDENT, null, $countInvisible), |
||
| 1692 | ] |
||
| 1693 | ); |
||
| 1694 | foreach ($course_categories as $code => $name) { |
||
| 1695 | $name = str_replace(get_lang('Department'), '', $name); |
||
| 1696 | $teachers[$name] = Statistics::countUsers(COURSEMANAGER, $code, $countInvisible); |
||
| 1697 | $students[$name] = Statistics::countUsers(STUDENT, $code, $countInvisible); |
||
| 1698 | } |
||
| 1699 | // docents for each course category |
||
| 1700 | $content .= Statistics::printStats(get_lang('Teachers'), $teachers); |
||
| 1701 | // students for each course category |
||
| 1702 | $content .= Statistics::printStats(get_lang('Students'), $students); |
||
| 1703 | break; |
||
| 1704 | case 'recentlogins': |
||
| 1705 | $content .= '<h2>'.sprintf(get_lang('LastXDays'), '31').'</h2>'; |
||
| 1706 | $form = new FormValidator( |
||
| 1707 | 'session_time', |
||
| 1708 | 'get', |
||
| 1709 | api_get_self().'?report=recentlogins&session_duration='.$sessionDuration |
||
| 1710 | ); |
||
| 1711 | $sessionTimeList = ['', 5 => 5, 15 => 15, 30 => 30, 60 => 60]; |
||
| 1712 | $form->addSelect('session_duration', [get_lang('SessionMinDuration'), get_lang('Minutes')], $sessionTimeList); |
||
| 1713 | $form->addButtonSend(get_lang('Filter')); |
||
| 1714 | $form->addHidden('report', 'recentlogins'); |
||
| 1715 | $content .= $form->returnForm(); |
||
| 1716 | |||
| 1717 | $content .= '<canvas class="col-md-12" id="canvas" height="200px" style="margin-bottom: 20px"></canvas>'; |
||
| 1718 | $content .= Statistics::printRecentLoginStats(false, $sessionDuration); |
||
| 1719 | $content .= Statistics::printRecentLoginStats(true, $sessionDuration); |
||
| 1720 | break; |
||
| 1721 | case 'logins': |
||
| 1722 | $content .= Statistics::printLoginStats($_GET['type']); |
||
| 1723 | break; |
||
| 1724 | case 'pictures': |
||
| 1725 | $content .= Statistics::printUserPicturesStats(); |
||
| 1726 | break; |
||
| 1727 | case 'no_login_users': |
||
| 1728 | $content .= Statistics::printUsersNotLoggedInStats(); |
||
| 1729 | break; |
||
| 1730 | case 'zombies': |
||
| 1731 | $content .= ZombieReport::create(['report' => 'zombies'])->display(true); |
||
| 1732 | break; |
||
| 1733 | case 'activities': |
||
| 1734 | $content .= Statistics::printActivitiesStats(); |
||
| 1735 | break; |
||
| 1736 | case 'messagesent': |
||
| 1737 | $messages_sent = Statistics::getMessages('sent'); |
||
| 1738 | $content .= Statistics::printStats(get_lang('MessagesSent'), $messages_sent); |
||
| 1739 | break; |
||
| 1740 | case 'messagereceived': |
||
| 1741 | $messages_received = Statistics::getMessages('received'); |
||
| 1742 | $content .= Statistics::printStats(get_lang('MessagesReceived'), $messages_received); |
||
| 1743 | break; |
||
| 1744 | case 'friends': |
||
| 1745 | // total amount of friends |
||
| 1746 | $friends = Statistics::getFriends(); |
||
| 1747 | $content .= Statistics::printStats(get_lang('CountFriends'), $friends); |
||
| 1748 | break; |
||
| 1749 | case 'logins_by_date': |
||
| 1750 | $content .= Statistics::printLoginsByDate(); |
||
| 1751 | break; |
||
| 1752 | case 'lti_tool_lp': |
||
| 1753 | $content .= Statistics::printLtiLearningPath(); |
||
| 1754 | break; |
||
| 1755 | case 'quarterly_report': |
||
| 1756 | |||
| 1757 | $htmlHeadXtra[] = '<script> |
||
| 1758 | function loadReportQuarterlyUsers () { |
||
| 1759 | $("#tracking-report-quarterly-users") |
||
| 1760 | .html(\'<p><span class="fa fa-spinner fa-spin fa-2x" aria-hidden="true"></span></p>\') |
||
| 1761 | .load(_p.web_ajax + "statistics.ajax.php?a=report_quarterly_users"); |
||
| 1762 | }</script>'; |
||
| 1763 | $htmlHeadXtra[] = '<script> |
||
| 1764 | function loadReportQuarterlyCourses () { |
||
| 1765 | $("#tracking-report-quarterly-courses") |
||
| 1766 | .html(\'<p><span class="fa fa-spinner fa-spin fa-2x" aria-hidden="true"></span></p>\') |
||
| 1767 | .load(_p.web_ajax + "statistics.ajax.php?a=report_quarterly_courses"); |
||
| 1768 | }</script>'; |
||
| 1769 | |||
| 1770 | $htmlHeadXtra[] = '<script> |
||
| 1771 | function loadReportQuarterlyHoursOfTraining () { |
||
| 1772 | $("#tracking-report-quarterly-hours-of-training") |
||
| 1773 | .html(\'<p><span class="fa fa-spinner fa-spin fa-2x" aria-hidden="true"></span></p>\') |
||
| 1774 | .load(_p.web_ajax + "statistics.ajax.php?a=report_quarterly_hours_of_training"); |
||
| 1775 | }</script>'; |
||
| 1776 | |||
| 1777 | $htmlHeadXtra[] = '<script> |
||
| 1778 | function loadReportQuarterlyCertificatesGenerated () { |
||
| 1779 | $("#tracking-report-quarterly-number-of-certificates-generated") |
||
| 1780 | .html(\'<p><span class="fa fa-spinner fa-spin fa-2x" aria-hidden="true"></span></p>\') |
||
| 1781 | .load(_p.web_ajax + "statistics.ajax.php?a=report_quarterly_number_of_certificates_generated"); |
||
| 1782 | }</script>'; |
||
| 1783 | |||
| 1784 | $htmlHeadXtra[] = '<script> |
||
| 1785 | function loadReportQuarterlySessionsByDuration () { |
||
| 1786 | $("#tracking-report-quarterly-sessions-by-duration") |
||
| 1787 | .html(\'<p><span class="fa fa-spinner fa-spin fa-2x" aria-hidden="true"></span></p>\') |
||
| 1788 | .load(_p.web_ajax + "statistics.ajax.php?a=report_quarterly_sessions_by_duration"); |
||
| 1789 | }</script>'; |
||
| 1790 | |||
| 1791 | $htmlHeadXtra[] = '<script> |
||
| 1792 | function loadReportQuarterlyCoursesAndSessions () { |
||
| 1793 | $("#tracking-report-quarterly-courses-and-sessions") |
||
| 1794 | .html(\'<p><span class="fa fa-spinner fa-spin fa-2x" aria-hidden="true"></span></p>\') |
||
| 1795 | .load(_p.web_ajax + "statistics.ajax.php?a=report_quarterly_courses_and_sessions"); |
||
| 1796 | }</script>'; |
||
| 1797 | |||
| 1798 | if (api_get_current_access_url_id() === 1) { |
||
| 1799 | $htmlHeadXtra[] = '<script> |
||
| 1800 | function loadReportQuarterlyTotalDiskUsage () { |
||
| 1801 | $("#tracking-report-quarterly-total-disk-usage") |
||
| 1802 | .html(\'<p><span class="fa fa-spinner fa-spin fa-2x" aria-hidden="true"></span></p>\') |
||
| 1803 | .load(_p.web_ajax + "statistics.ajax.php?a=report_quarterly_total_disk_usage"); |
||
| 1804 | }</script>'; |
||
| 1805 | } |
||
| 1806 | |||
| 1807 | $content .= Display::tag('H4', get_lang('ReportQuarterlyUsers'), ['style' => 'margin-bottom: 25px;']); |
||
| 1808 | $content .= Display::url( |
||
| 1809 | get_lang('Show'), |
||
| 1810 | 'javascript://', |
||
| 1811 | ['onclick' => 'loadReportQuarterlyUsers();', 'class' => 'btn btn-default'] |
||
| 1812 | ); |
||
| 1813 | $content .= Display::div('', ['id' => 'tracking-report-quarterly-users', 'style' => 'margin: 30px;']); |
||
| 1814 | |||
| 1815 | $content .= Display::tag('H4', get_lang('ReportQuarterlyCourses'), ['style' => 'margin-bottom: 25px;']); |
||
| 1816 | $content .= Display::url( |
||
| 1817 | get_lang('Show'), |
||
| 1818 | 'javascript://', |
||
| 1819 | ['onclick' => 'loadReportQuarterlyCourses();', 'class' => 'btn btn-default'] |
||
| 1820 | ); |
||
| 1821 | $content .= Display::div('', ['id' => 'tracking-report-quarterly-courses', 'style' => 'margin: 30px;']); |
||
| 1822 | |||
| 1823 | $content .= Display::tag('H4', get_lang('ReportQuarterlyHoursOfTraining'), ['style' => 'margin-bottom: 25px;']); |
||
| 1824 | $content .= Display::url( |
||
| 1825 | get_lang('Show'), |
||
| 1826 | 'javascript://', |
||
| 1827 | ['onclick' => 'loadReportQuarterlyHoursOfTraining();', 'class' => 'btn btn-default'] |
||
| 1828 | ); |
||
| 1829 | $content .= Display::div( |
||
| 1830 | '', |
||
| 1831 | [ |
||
| 1832 | 'id' => 'tracking-report-quarterly-hours-of-training', |
||
| 1833 | 'style' => 'margin: 30px;', |
||
| 1834 | ] |
||
| 1835 | ); |
||
| 1836 | $content .= Display::tag( |
||
| 1837 | 'H4', |
||
| 1838 | get_lang('ReportQuarterlyNumberOfCertificatesGenerated'), |
||
| 1839 | ['style' => 'margin-bottom: 25px;'] |
||
| 1840 | ); |
||
| 1841 | $content .= Display::url( |
||
| 1842 | get_lang('Show'), |
||
| 1843 | 'javascript://', |
||
| 1844 | ['onclick' => 'loadReportQuarterlyCertificatesGenerated();', 'class' => 'btn btn-default'] |
||
| 1845 | ); |
||
| 1846 | $content .= Display::div( |
||
| 1847 | '', |
||
| 1848 | ['id' => 'tracking-report-quarterly-number-of-certificates-generated', 'style' => 'margin: 30px;'] |
||
| 1849 | ); |
||
| 1850 | $content .= Display::tag( |
||
| 1851 | 'H4', |
||
| 1852 | get_lang('ReportQuarterlySessionsByDuration'), |
||
| 1853 | ['style' => 'margin-bottom: 25px;'] |
||
| 1854 | ); |
||
| 1855 | $content .= Display::url( |
||
| 1856 | get_lang('Show'), |
||
| 1857 | 'javascript://', |
||
| 1858 | ['onclick' => 'loadReportQuarterlySessionsByDuration();', 'class' => 'btn btn-default'] |
||
| 1859 | ); |
||
| 1860 | $content .= Display::div( |
||
| 1861 | '', |
||
| 1862 | ['id' => 'tracking-report-quarterly-sessions-by-duration', 'style' => 'margin: 30px;'] |
||
| 1863 | ); |
||
| 1864 | $content .= Display::tag( |
||
| 1865 | 'H4', |
||
| 1866 | get_lang('ReportQuarterlyCoursesAndSessions'), |
||
| 1867 | ['style' => 'margin-bottom: 25px;'] |
||
| 1868 | ); |
||
| 1869 | $content .= Display::url( |
||
| 1870 | get_lang('Show'), |
||
| 1871 | 'javascript://', |
||
| 1872 | ['onclick' => 'loadReportQuarterlyCoursesAndSessions();', 'class' => 'btn btn-default'] |
||
| 1873 | ); |
||
| 1874 | $content .= Display::div( |
||
| 1875 | '', |
||
| 1876 | [ |
||
| 1877 | 'id' => 'tracking-report-quarterly-courses-and-sessions', |
||
| 1878 | 'style' => 'margin: 30px;', |
||
| 1879 | ] |
||
| 1880 | ); |
||
| 1881 | |||
| 1882 | if (api_get_current_access_url_id() === 1) { |
||
| 1883 | $content .= Display::tag( |
||
| 1884 | 'H4', |
||
| 1885 | get_lang('ReportQuarterlyTotalDiskUsage'), |
||
| 1886 | ['style' => 'margin-bottom: 25px;'] |
||
| 1887 | ); |
||
| 1888 | $content .= Display::url( |
||
| 1889 | get_lang('Show'), |
||
| 1890 | 'javascript://', |
||
| 1891 | ['onclick' => 'loadReportQuarterlyTotalDiskUsage();', 'class' => 'btn btn-default'] |
||
| 1892 | ); |
||
| 1893 | $content .= Display::div( |
||
| 1894 | '', |
||
| 1895 | [ |
||
| 1896 | 'id' => 'tracking-report-quarterly-total-disk-usage', |
||
| 1897 | 'style' => 'margin: 30px;', |
||
| 1898 | ] |
||
| 1899 | ); |
||
| 1900 | } |
||
| 1901 | |||
| 1902 | break; |
||
| 1903 | case 'duplicated_users': |
||
| 1904 | $interbreadcrumb[] = [ |
||
| 1905 | 'name' => $tool_name, |
||
| 1906 | 'url' => 'index.php', |
||
| 1907 | ]; |
||
| 1908 | |||
| 1909 | $additionalExtraFieldsInfo = TrackingCourseLog::getAdditionalProfileExtraFields(); |
||
| 1910 | |||
| 1911 | $frmFields = TrackingCourseLog::displayAdditionalProfileFields([], api_get_self()); |
||
| 1912 | $table = Statistics::returnDuplicatedUsersTable('name', $additionalExtraFieldsInfo); |
||
| 1913 | |||
| 1914 | if (isset($_GET['action_table'])) { |
||
| 1915 | $data = $table->toArray(true, true); |
||
| 1916 | |||
| 1917 | if ('export_excel' === $_GET['action_table']) { |
||
| 1918 | Export::arrayToXls($data); |
||
| 1919 | } elseif ('export_csv' === $_GET['action_table']) { |
||
| 1920 | Export::arrayToCsv($data); |
||
| 1921 | } |
||
| 1922 | |||
| 1923 | exit; |
||
| 1924 | } |
||
| 1925 | |||
| 1926 | $htmlHeadXtra[] = '<script>'.UserManager::getScriptFunctionForActiveFilter().'</script>'; |
||
| 1927 | |||
| 1928 | $content .= Display::page_subheader2(get_lang('DuplicatedUsers')); |
||
| 1929 | $content .= Display::return_message(get_lang('ThisReportOnlyListsUsersThatHaveTheSameFirstnameAndLastname')); |
||
| 1930 | |||
| 1931 | $content .= $frmFields; |
||
| 1932 | $content .= $table->return_table(); |
||
| 1933 | break; |
||
| 1934 | case 'duplicated_users_by_mail': |
||
| 1935 | $interbreadcrumb[] = [ |
||
| 1936 | 'name' => $tool_name, |
||
| 1937 | 'url' => 'index.php', |
||
| 1938 | ]; |
||
| 1939 | |||
| 1940 | $additionalExtraFieldsInfo = TrackingCourseLog::getAdditionalProfileExtraFields(); |
||
| 1941 | |||
| 1942 | $frmFields = TrackingCourseLog::displayAdditionalProfileFields([], api_get_self()); |
||
| 1943 | $table = Statistics::returnDuplicatedUsersTable('email', $additionalExtraFieldsInfo); |
||
| 1944 | |||
| 1945 | if (isset($_GET['action_table'])) { |
||
| 1946 | $data = $table->toArray(true, true); |
||
| 1947 | |||
| 1948 | if ('export_excel' === $_GET['action_table']) { |
||
| 1949 | Export::arrayToXls($data); |
||
| 1950 | } elseif ('export_csv' === $_GET['action_table']) { |
||
| 1951 | Export::arrayToCsv($data); |
||
| 1952 | } |
||
| 1953 | |||
| 1954 | exit; |
||
| 1955 | } |
||
| 1956 | |||
| 1957 | $htmlHeadXtra[] = '<script>'.UserManager::getScriptFunctionForActiveFilter().'</script>'; |
||
| 1958 | |||
| 1959 | $content .= Display::page_subheader2(get_lang('DuplicatedUsersByMail')); |
||
| 1960 | $content .= Display::return_message(get_lang('ThisReportOnlyListsUsersThatHaveTheSameEmail')); |
||
| 1961 | |||
| 1962 | $content .= $frmFields; |
||
| 1963 | $content .= $table->return_table(); |
||
| 1964 | break; |
||
| 1965 | } |
||
| 1966 | |||
| 1967 | Display::display_header($tool_name); |
||
| 1968 | echo Display::page_header($tool_name); |
||
| 1969 | echo '<table><tr>'; |
||
| 1970 | foreach ($tools as $section => $items) { |
||
|
0 ignored issues
–
show
Comprehensibility
Bug
introduced
by
Loading history...
|
|||
| 1971 | echo '<td style="vertical-align:top;">'; |
||
| 1972 | echo '<h3>'.$section.'</h3>'; |
||
| 1973 | echo '<ul>'; |
||
| 1974 | foreach ($items as $key => $value) { |
||
| 1975 | echo '<li><a href="index.php?'.$key.'">'.$value.'</a></li>'; |
||
| 1976 | } |
||
| 1977 | echo '</ul>'; |
||
| 1978 | echo '</td>'; |
||
| 1979 | } |
||
| 1980 | echo '</tr></table>'; |
||
| 1981 | |||
| 1982 | //@todo: spaces between elements should be handled in the css, br should be removed if only there for presentation |
||
| 1983 | echo '<br/><br/>'; |
||
| 1984 | |||
| 1985 | echo $content; |
||
| 1986 | |||
| 1987 | Display::display_footer(); |
||
| 1988 | |||
| 1989 | if (isset($_GET['export'])) { |
||
| 1990 | ob_end_clean(); |
||
| 1991 | } |
||
| 1992 |