Update from 1.11.x

pull/3733/head
Julio Montoya 5 years ago
parent 24dae58ec0
commit 74d69de14c
  1. 204
      public/main/inc/lib/attendance.lib.php
  2. 21
      public/main/inc/lib/pear/HTML/Table.php
  3. 7
      public/main/inc/lib/pear/Text/CAPTCHA.php
  4. 123
      public/main/mySpace/access_details_session.php
  5. 20
      public/main/mySpace/admin.php
  6. 15
      public/main/mySpace/coaches.php
  7. 6
      public/main/mySpace/lp_tracking.php
  8. 9
      public/main/mySpace/myStudents.php

@ -2226,6 +2226,210 @@ class Attendance
$pdf->html_to_pdf_with_template($tableToString);
}
/**
* Return all course for a student between dates and order by key date (Y-m-d).
*
* @param int $studentId
* @param \DateTime $startDate
* @param \DateTime $endDate
* @param bool $orderDesc
*
* @return array
*/
public function getCoursesWithAttendance(
$studentId = 0,
DateTime $startDate = null,
DateTime $endDate = null,
$orderDesc = false
) {
// Lang variables
$presentString = get_lang('Present');
//$absentString = get_lang('Absent');
$absentString = '-';
// Lang variables
$attendanceLib = new Attendance();
$data = [];
/*
$specialCourses = CourseManager::returnSpecialCourses(
$studentId, false, false
);
*/
$courses = CourseManager::returnCourses(
$studentId,
false,
false
);
/* Get course with (in_category) and without (not_category) category */
foreach ($courses as $coursesKey => $courseData) {
/*
* $coursesKey can be in_category or not_category for courses
* */
$totalCoursesNoCategory = count($courseData);
for ($i = 0; $i < $totalCoursesNoCategory; $i++) {
$courseItem = $courseData[$i];
$courseId = $courseItem['course_id'];
/* Get all attendance by courses*/
$attenances = $attendanceLib->get_attendances_list($courseId);
$temp = [];
$sheetsProccessed = [];
$tempDate = [];
foreach ($attenances as $attendanceData) {
$attendanceId = $attendanceData['id'];
$sheets = $attendanceLib->get_users_attendance_sheet(
$attendanceId,
$studentId,
0,
$courseId,
$startDate,
$endDate
);
$sheetsProccessed[] = [];
foreach ($sheets as $sheetData) {
$totalb = count($sheetData);
$tempDate = [];
for ($ii = 0; $ii < $totalb; $ii++) {
$attendancesProccess = $sheetData[$ii];
if (!empty($attendancesProccess)) {
$dateTemp = $attendancesProccess['0'];
$attendancesProccess[0] = $attendancesProccess[1];
$attendancesProccess[1] = $dateTemp;
$attendancesProccess[2] = $courseItem['title'];
$attendancesProccess['courseTitle'] = $courseItem['title'];
$attendancesProccess[3] = $courseItem['real_id'];
$attendancesProccess['courseId'] = $courseItem['real_id'];
$attendancesProccess[4] = $attendanceData['name'];
$attendancesProccess['attendanceName'] = $attendanceData['name'];
$attendancesProccess['courseCode'] = $courseItem['course_code'];
$attendancesProccess[5] = $attendanceData['id'];
$attendancesProccess['attendanceId'] = $attendanceData['id'];
if ($attendancesProccess['presence'] == 1) {
$attendancesProccess['presence'] = $presentString;
$attendancesProccess[0] = 1;
} else {
$attendancesProccess['presence'] = $absentString;
$attendancesProccess[0] = 0;
}
$attendancesProccess['session'] = 0;
$attendancesProccess['sessionName'] = '';
$tempDate[] = $attendancesProccess;
$dateKey = new DateTime($dateTemp);
/*
$attendancesProccess['teacher'] = '';
if(isset($courseItem['teachers']) and isset($courseItem['teachers'][0])){
$attendancesProccess['teacher'] = $courseItem['teachers'][0]['fullname'];
}
*/
$data[$dateKey->format('Y-m-d')][] = $attendancesProccess;
}
}
}
$sheetsProccessed[] = $tempDate;
$temp[] = $sheetsProccessed;
}
$courses['not_category'][$i]['attendanceSheet'] = $temp;
}
}
/* Sessions */
$studentId = (int) $studentId;
$sql = "
SELECT
session_id,
c_id
FROM
session_rel_course_rel_user
WHERE
user_id = $studentId";
$rs = Database::query($sql);
// get info from sessions
while ($row = Database::fetch_array($rs, 'ASSOC')) {
$courseId = $row['c_id'];
$sessionId = $row['session_id'];
$courseItem = api_get_course_info_by_id($courseId);
$attenances = $attendanceLib->get_attendances_list(
$courseId,
$sessionId
);
$temp = [];
$sheetsProccessed = [];
$tempDate = [];
foreach ($attenances as $attendanceData) {
$attendanceId = $attendanceData['id'];
$sheets = $attendanceLib->get_users_attendance_sheet(
$attendanceId,
$studentId,
0,
$courseId,
$startDate,
$endDate
);
$sheetsProccessed[] = [];
foreach ($sheets as $sheetData) {
$totalb = count($sheetData);
$tempDate = [];
for ($ii = 0; $ii < $totalb; $ii++) {
$work = $sheetData[$ii];
$attendancesProccess = $work;
if (!empty($attendancesProccess)) {
$dateTemp = $attendancesProccess['0'];
$attendancesProccess[0] = $attendancesProccess[1];
$attendancesProccess[1] = $dateTemp;
$attendancesProccess[2] = $courseItem['title'];
$attendancesProccess['courseTitle'] = $courseItem['title'];
$attendancesProccess[3] = $courseItem['real_id'];
$attendancesProccess['courseId'] = $courseItem['real_id'];
$attendancesProccess[4] = $attendanceData['name'];
$attendancesProccess['attendanceName'] = $attendanceData['name'];
$attendancesProccess[5] = $attendanceData['id'];
$attendancesProccess['attendanceId'] = $attendanceData['id'];
$attendancesProccess['courseCode'] = $courseItem['official_code'];
if ($attendancesProccess['presence'] == 1) {
$attendancesProccess['presence'] = $presentString;
$attendancesProccess[0] = 1;
} else {
$attendancesProccess['presence'] = $absentString;
$attendancesProccess[0] = 0;
}
$attendancesProccess['session'] = $sessionId;
$attendancesProccess['sessionName'] = api_get_session_name($sessionId);
$tempDate[] = $attendancesProccess;
$dateKey = new DateTime($dateTemp);
/*
$attendancesProccess['teacher'] = '';
if(isset($courseItem['tutor_name']) ){
$attendancesProccess['teacher'] = $courseItem['tutor_name'];
}
*/
$data[$dateKey->format('Y-m-d')][] = $attendancesProccess;
}
}
}
$sheetsProccessed[] = $tempDate;
$temp[] = $sheetsProccessed;
}
$courses['session'][$i]['attendanceSheet'] = $temp;
}
/* Order desc by date, by default */
if ($orderDesc == true) {
ksort($data);
} else {
krsort($data);
}
return $data;
}
public function setAttendanceForm(FormValidator $form, CAttendance $attendance = null)
{
$skillList = [];

@ -660,6 +660,27 @@ class HTML_Table extends HTML_Common
$this->_tbodies[$body]->setHeaderContents($row, $col, $contents, $attributes);
}
public function setHeaders($headers)
{
$column = 0;
foreach ($headers as $header) {
$this->setHeaderContents(0, $column, $header);
$column++;
}
}
public function setData($data)
{
$row = 1;
foreach ($data as $line) {
$column = 0;
foreach ($line as $content) {
$this->setCellContents($row, $column, $content);
$column++;
}
$row++;
}
}
/**
* Adds a table row and returns the row identifier
* @param array $contents (optional) Must be a indexed array of

@ -11,13 +11,6 @@
* @license http://www.opensource.org/licenses/bsd-license.php BSD License
* @link http://pear.php.net/package/Text_CAPTCHA
*/
/**
* Require Exception class for error handling.
*/
//require_once 'Text/CAPTCHA/Exception.php';
/**
* Require Text_Password class for generating the phrase.
*/
//require_once 'Text/Password.php';
/**

@ -356,7 +356,7 @@ if ($form->validate()) {
$tpl = new Template('', false, false, false, true, false, false);
$tpl->assign('title', get_lang('Certificate of achievement'));
$tpl->assign('student', $userInfo['complete_name']);
$tpl->assign('table_progress', $totalTable.$totalCourseSessionTable.'<pagebreak>'.$courseSessionTable);
$tpl->assign('table_progress', $title.$first.$totalCourseSessionTable.'<pagebreak>'.$courseSessionTable);
$content = $tpl->fetch($tpl->get_template('my_space/pdf_export_student.tpl'));
@ -424,72 +424,81 @@ if ($formByDay->validate()) {
$list = Tracking::get_time_spent_on_the_platform($userId, 'wide', $from, $to, true);
$newList = [];
foreach ($list as $item) {
$key = substr($item['login_date'], 0, 10);
$dateLogout = substr($item['logout_date'], 0, 10);
if ($dateLogout > $key) {
$itemLogoutOriginal = $item['logout_date'];
$fromItemObject = DateTime::createFromFormat('Y-m-d H:i:s', $item['login_date'], new DateTimeZone('UTC'));
$toItemObject = DateTime::createFromFormat('Y-m-d H:i:s', $item['logout_date'], new DateTimeZone('UTC'));
$item['logout_date'] = api_get_utc_datetime($key.' 23:59:59');
$period = new DatePeriod(
$fromItemObject,
new DateInterval('P1D'),
$toItemObject
);
$counter = 1;
$itemKey = null;
foreach ($period as $value) {
$dateToCheck = api_get_utc_datetime($value->format('Y-m-d').' 00:00:01');
$end = api_get_utc_datetime($value->format('Y-m-d').' 23:59:59');
if (1 === $counter) {
$dateToCheck = $item['login_date'];
}
$itemKey = substr($value->format('Y-m-d'), 0, 10);
if (!empty($list)) {
foreach ($list as $item) {
$key = substr($item['login_date'], 0, 10);
$dateLogout = substr($item['logout_date'], 0, 10);
if ($dateLogout > $key) {
$itemLogoutOriginal = $item['logout_date'];
$fromItemObject = DateTime::createFromFormat(
'Y-m-d H:i:s',
$item['login_date'],
new DateTimeZone('UTC')
);
$toItemObject = DateTime::createFromFormat(
'Y-m-d H:i:s',
$item['logout_date'],
new DateTimeZone('UTC')
);
$item['logout_date'] = api_get_utc_datetime($key.' 23:59:59');
if (isset($newList[$itemKey])) {
if ($newList[$itemKey]['login_date']) {
$dateToCheck = $newList[$itemKey]['login_date'];
$period = new DatePeriod(
$fromItemObject,
new DateInterval('P1D'),
$toItemObject
);
$counter = 1;
$itemKey = null;
foreach ($period as $value) {
$dateToCheck = api_get_utc_datetime($value->format('Y-m-d').' 00:00:01');
$end = api_get_utc_datetime($value->format('Y-m-d').' 23:59:59');
if (1 === $counter) {
$dateToCheck = $item['login_date'];
}
}
$itemKey = substr($value->format('Y-m-d'), 0, 10);
$newList[$itemKey] = [
'login_date' => $dateToCheck,
'logout_date' => $end,
'diff' => 0,
];
if (isset($newList[$itemKey])) {
if ($newList[$itemKey]['login_date']) {
$dateToCheck = $newList[$itemKey]['login_date'];
}
}
$counter++;
}
$newList[$itemKey] = [
'login_date' => $dateToCheck,
'logout_date' => $end,
'diff' => 0,
];
if (!empty($itemKey) && isset($newList[$itemKey])) {
if (
substr(api_get_local_time($newList[$itemKey]['login_date']), 0, 10) ===
substr(api_get_local_time($itemLogoutOriginal), 0, 10)
) {
$newList[$itemKey]['logout_date'] = $itemLogoutOriginal;
$counter++;
}
if (!empty($itemKey) && isset($newList[$itemKey])) {
if (
substr(api_get_local_time($newList[$itemKey]['login_date']), 0, 10) ===
substr(api_get_local_time($itemLogoutOriginal), 0, 10)
) {
$newList[$itemKey]['logout_date'] = $itemLogoutOriginal;
}
}
}
}
if (!isset($newList[$key])) {
$newList[$key] = [
'login_date' => $item['login_date'],
'logout_date' => $item['logout_date'],
'diff' => 0,
];
} else {
$newList[$key] = [
'login_date' => $newList[$key]['login_date'],
'logout_date' => $item['logout_date'],
'diff' => 0,
];
if (!isset($newList[$key])) {
$newList[$key] = [
'login_date' => $item['login_date'],
'logout_date' => $item['logout_date'],
'diff' => 0,
];
} else {
$newList[$key] = [
'login_date' => $newList[$key]['login_date'],
'logout_date' => $item['logout_date'],
'diff' => 0,
];
}
}
}
if (!empty($newList)) {
foreach ($newList as &$item) {
$item['diff'] = api_strtotime($item['logout_date']) - api_strtotime($item['login_date']);

@ -1,4 +1,5 @@
<?php
/* For licensing terms, see /license.txt */
/**
@ -10,13 +11,12 @@ $cidReset = true;
require_once __DIR__.'/../inc/global.inc.php';
$this_section = SECTION_TRACKING;
$nameTools = get_lang('Administrators');
api_block_anonymous_users();
$interbreadcrumb[] = ["url" => "index.php", "name" => get_lang('Reporting')];
Display :: display_header($nameTools);
Display::display_header($nameTools);
$data = [];
api_display_tool_title($nameTools);
// Database Table Definitions
@ -39,12 +39,16 @@ $result_admins = Database::query($sql);
if (api_is_western_name_order()) {
echo '<table class="table table-hover table-striped data_table">
<tr><th>'.get_lang('First name').'</th>
<th>'.get_lang('Last name').'</th><th>'.get_lang('e-mail').'</th></tr>';
<tr>
<th>'.get_lang('FirstName').'</th>
<th>'.get_lang('LastName').'</th>
<th>'.get_lang('Email').'</th></tr>';
} else {
echo '<table class="table table-hover table-striped data_table">
<tr><th>'.get_lang('Last name').'</th>
<th>'.get_lang('First name').'</th><th>'.get_lang('e-mail').'</th></tr>';
<tr>
<th>'.get_lang('LastName').'</th>
<th>'.get_lang('FirstName').'</th>
<th>'.get_lang('Email').'</th></tr>';
}
if (api_is_western_name_order(PERSON_NAME_DATA_EXPORT)) {
@ -100,7 +104,7 @@ if (Database::num_rows($result_admins) > 0) {
echo '</table>';
if (isset($_POST['export'])) {
export_csv($header, $data, 'administrators.csv');
Export::arrayToCsv($header + $data, 'administrators.csv');
}
echo "

@ -18,10 +18,10 @@ if (isset($_GET["id_student"])) {
$interbreadcrumb[] = ["url" => "student.php", "name" => get_lang('Learners')];
}
Display :: display_header($nameTools);
Display::display_header($nameTools);
api_display_tool_title($nameTools);
$data = [];
$tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
$tbl_course_user = Database::get_main_table(TABLE_MAIN_COURSE_USER);
$tbl_user = Database::get_main_table(TABLE_MAIN_USER);
@ -31,9 +31,6 @@ $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_C
$tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
$tbl_track_login = Database::get_main_table(TABLE_STATISTIC_TRACK_E_LOGIN);
/**
* MAIN PART.
*/
if (isset($_POST['export'])) {
$order_clause = api_is_western_name_order(PERSON_NAME_DATA_EXPORT) ? ' ORDER BY firstname, lastname' : ' ORDER BY lastname, firstname';
} else {
@ -57,7 +54,7 @@ if (isset($_GET["id_student"])) {
$sql_coachs = "SELECT DISTINCT user_id as id_coach, user.id as user_id, lastname, firstname
FROM
$tbl_user as user,
$tbl_session_rel_course_user as srcu,
$tbl_session_rel_course_rel_user as srcu,
$tbl_course_user as course_rel_user,
$tbl_course as c
WHERE
@ -74,7 +71,7 @@ if (isset($_GET["id_student"])) {
$result_coachs = Database::query($sql_coachs);
if (api_is_western_name_order()) {
echo '<table class="data_table">
echo '<table class="table table-hover table-striped data_table">
<tr>
<th>'.get_lang('First name').'</th>
<th>'.get_lang('Last name').'</th>
@ -83,7 +80,7 @@ if (api_is_western_name_order()) {
<th>'.get_lang('Learners').'</th>
</tr>';
} else {
echo '<table class="data_table">
echo '<table class="table table-hover table-striped data_table">
<tr>
<th>'.get_lang('Last name').'</th>
<th>'.get_lang('First name').'</th>
@ -209,7 +206,7 @@ if (Database::num_rows($result_coachs) > 0) {
echo '</table>';
if (isset($_POST['export'])) {
export_csv($header, $data, 'coaches.csv');
Export::arrayToCsv($header + $data, 'coaches.csv');
}
echo "<br /><br />";

@ -90,7 +90,7 @@ switch ($action) {
$itemViewId = isset($_REQUEST['extend_attempt_id']) ? $_REQUEST['extend_attempt_id'] : 0;
$em = Database::getManager();
$repo = $em->getRepository('ChamiloCourseBundle:CLpItemView');
$repo = $em->getRepository(CLpItemView::class);
/** @var CLpItemView $itemView */
$itemView = $repo->find($itemViewId);
@ -98,8 +98,8 @@ switch ($action) {
api_not_allowed();
}
$view = $em->getRepository('ChamiloCourseBundle:CLpView')->find($itemView->getLpViewId());
$lp = $em->getRepository('ChamiloCourseBundle:CLp')->find($view->getLpId());
$view = $em->getRepository(\Chamilo\CourseBundle\Entity\CLpView::class)->find($itemView->getLpViewId());
$lp = $em->getRepository(\Chamilo\CourseBundle\Entity\CLp::class)->find($view->getLpId());
$duration = learnpathItem::getScormTimeFromParameter('js', $itemView->getTotalTime());
$endTime = $itemView->getStartTime() + $itemView->getTotalTime();

@ -17,7 +17,7 @@ require_once '../work/work.lib.php';
api_block_anonymous_users();
//$htmlHeadXtra[] = '<script type="text/javascript" src="'.api_get_path(WEB_PUBLIC_PATH).'assets/jquery.easy-pie-chart/dist/jquery.easypiechart.js"></script>';
$htmlHeadXtra[] = null;
$export = isset($_GET['export']) ? $_GET['export'] : false;
$sessionId = isset($_GET['sid']) ? (int) $_GET['sid'] : 0;
$origin = api_get_origin();
@ -49,7 +49,8 @@ $allowedToTrackUser =
api_is_drh() ||
api_is_student_boss() ||
api_is_course_admin() ||
api_is_teacher();
api_is_teacher()
;
if (false === $allowedToTrackUser && !empty($courseInfo)) {
if (empty($sessionId)) {
@ -427,7 +428,7 @@ switch ($action) {
true,
false
);
} catch (MpdfException $e) {
} catch (\Mpdf\MpdfException $e) {
error_log($e);
}
exit;
@ -1915,7 +1916,7 @@ if (empty($details)) {
/*$hookContents = $hookQuizTracking
? $hookQuizTracking->notifyTrackingContent($exercise_id, $studentId)
: [];*/
$hookContents = '';
$hookContents = [];
if (!isset($score_percentage) && $count_attempts > 0) {
$scores_lp = Tracking::get_avg_student_exercise_score(
$studentId,

Loading…
Cancel
Save