Skip to content

Commit

Permalink
Bug fixes and performance improvements
Browse files Browse the repository at this point in the history
  • Loading branch information
intelliboard committed Nov 2, 2020
1 parent 8af238c commit 432e8dd
Show file tree
Hide file tree
Showing 19 changed files with 255 additions and 111 deletions.
4 changes: 3 additions & 1 deletion classes/external_functions.php
Expand Up @@ -423,7 +423,9 @@ public function __construct()
'course_custom_fields',
'monitor90',
'monitor91',
'monitor92'
'monitor92',
'intellicart_vendors',
'report232',
];
}
public function get_function($params = null)
Expand Down
60 changes: 31 additions & 29 deletions classes/services/bb_collaborate_service.php
Expand Up @@ -121,37 +121,39 @@ public function insert_session_attendees($sessionuid, $attendees) {
$transaction = $DB->start_delegated_transaction();

foreach($attendees as $item) {
$row = new \stdClass();
$row->sessionuid = $sessionuid;
$row->useruid = $item['userId'];
$row->external_user_id = $item['externalUserId'];
$row->role = $item['role'];
$row->display_name = $item['displayName'];
$row->first_join_time = 0;
$row->last_left_time = 0;
$row->duration = 0;
$row->rejoins = -1;

foreach($item['attendance'] as $join) {
$row->duration += $join['duration'];
$row->rejoins += 1;

if(
strtotime($join['joined']) < $row->first_join_time or
$row->first_join_time === 0
) {
$row->first_join_time = strtotime($join['joined']);
if (isset($item['userId']) && isset($item['externalUserId'])) {
$row = new \stdClass();
$row->sessionuid = $sessionuid;
$row->useruid = $item['userId'];
$row->external_user_id = $item['externalUserId'];
$row->role = $item['role'];
$row->display_name = $item['displayName'];
$row->first_join_time = 0;
$row->last_left_time = 0;
$row->duration = 0;
$row->rejoins = -1;

foreach($item['attendance'] as $join) {
$row->duration += $join['duration'];
$row->rejoins += 1;

if(
strtotime($join['joined']) < $row->first_join_time or
$row->first_join_time === 0
) {
$row->first_join_time = strtotime($join['joined']);
}

if(
strtotime($join['left']) < $row->last_left_time or
$row->last_left_time === 0
) {
$row->last_left_time = strtotime($join['left']);
}
}

if(
strtotime($join['left']) < $row->last_left_time or
$row->last_left_time === 0
) {
$row->last_left_time = strtotime($join['left']);
}
$DB->insert_record('local_intelliboard_bb_partic', $row);
}

$DB->insert_record('local_intelliboard_bb_partic', $row);
}

// Assuming the both inserts work, we get to the following line.
Expand Down Expand Up @@ -249,4 +251,4 @@ public function synchronize_attendances($session, $attendances) {

return true;
}
}
}
2 changes: 1 addition & 1 deletion competencies/index.php
Expand Up @@ -156,7 +156,7 @@
<?php endif; ?>
</div>

<div class="intelliboard-box">
<div class="intelliboard-box competency-dashboard-intelliboard-box">
<?php if($n6): ?>
<div class="box<?php echo($n7)?'50':'100'; ?> pull-left h410">
<ul class="nav nav-tabs clearfix">
Expand Down
6 changes: 6 additions & 0 deletions db/caches.php
Expand Up @@ -29,5 +29,11 @@
],
'reports_list' => [
'mode' => cache_store::MODE_APPLICATION
],
'instructor_course_data' => [
'mode' => cache_store::MODE_APPLICATION,
'simplekeys' => true,
'simpledata' => true,
'ttl' => 900 // 15 minutes
]
];
97 changes: 94 additions & 3 deletions externallib.php
Expand Up @@ -3047,7 +3047,7 @@ public function get_scormattempts($params)
(SELECT s.value FROM {scorm_scoes_track} s WHERE s.element = 'x.start.time' and s.userid = sst.userid and s.scormid = sst.scormid and s.attempt = sst.attempt) as starttime,
(SELECT s.value FROM {scorm_scoes_track} s WHERE (s.element = 'cmi.core.score.raw' OR s.element = 'cmi.score.raw') and s.userid = sst.userid and s.scormid = sst.scormid and s.attempt = sst.attempt) as score,
(SELECT s.value FROM {scorm_scoes_track} s WHERE (s.element = 'cmi.core.score.max' OR s.element = 'cmi.score.max') and s.userid = sst.userid and s.scormid = sst.scormid and s.attempt = sst.attempt) as max_score,
(SELECT s.value FROM {scorm_scoes_track} s WHERE s.element = 'cmi.core.lesson_status' and s.userid = sst.userid and s.scormid = sst.scormid and s.attempt = sst.attempt) as status,
(SELECT s.value FROM {scorm_scoes_track} s WHERE s.element = 'cmi.completion_status' and s.userid = sst.userid and s.scormid = sst.scormid and s.attempt = sst.attempt) as status,
(SELECT s.value FROM {scorm_scoes_track} s WHERE s.element = 'cmi.core.total_time' and s.userid = sst.userid and s.scormid = sst.scormid and s.attempt = sst.attempt) as totaltime,
(SELECT s.timemodified FROM {scorm_scoes_track} s WHERE element = 'cmi.core.total_time' and s.userid = sst.userid and s.scormid = sst.scormid and s.attempt = sst.attempt) as timemodified,
sk.completionscorerequired
Expand Down Expand Up @@ -7215,6 +7215,10 @@ function report111($params)
$sql_filter .= $this->get_filter_course_sql($params, "c.");
$sql_filter .= $this->vendor_filter('lit.userid', 'lit.courseid', $params);
$sql_join = $this->get_suspended_sql($params);
$sql_join_datefilter = '';
if($params->timestart && $params->timefinish) {
$sql_join_datefilter = "JOIN {local_intelliboard_logs} lil ON lil.trackid = lit.id AND (lil.timepoint BETWEEN {$params->timestart} AND {$params->timefinish})";
}

return $this->get_report_data("
SELECT
Expand Down Expand Up @@ -7269,6 +7273,7 @@ function report111($params)
LEFT JOIN {course_categories} cc ON cc.id = c.category
LEFT JOIN {user} u ON u.id=lit.userid
$sql_join
$sql_join_datefilter
WHERE lit.courseid>1 AND c.id IS NOT NULL $sql_filter
GROUP BY lit.courseid,lit.userid,u.id,c.id,cc.id $sql_having $sql_order", $params);
}
Expand Down Expand Up @@ -13477,7 +13482,11 @@ public function report212($params) {
public function report213($params) {
global $CFG;
if (!$params->custom2) {
return [];
$scorms = $this->get_course_scorms($params);
$params->custom2 = [];
foreach ($scorms as $scorm){
$params->custom2[] = $scorm->id;
}
}

$columns = array_merge(array(
Expand Down Expand Up @@ -13517,7 +13526,7 @@ public function report213($params) {
}

return $this->get_report_data("
SELECT DISTINCT CONCAT(u.id, '_', COALESCE(st.attempt, 0), '_', COALESCE(sq.id, 0)) AS uniqueid,
SELECT DISTINCT CONCAT(u.id, '_', COALESCE(st.attempt, 0), '_', COALESCE(sq.id, 0), '_', COALESCE(st.scormid, 0)) AS uniqueid,
c.fullname AS course,
s.name AS scorm,
st.scormid AS scormid,
Expand Down Expand Up @@ -20948,4 +20957,86 @@ public function course_custom_fields($params) {
['systemcontext' => context_system::instance()->id]
);
}

public function intellicart_vendors($params) {
global $DB;

return $DB->get_records('local_intellicart_vendors');
}

public function report232($params) {
$columns = array_merge([
"vendor_ic.vendors_names",
"vendor_ic.emails",
"vendor_ic.vendors_idnumbers",
"u.firstname",
"u.lastname",
"u.email",
"cc.name",
"c.fullname",
"ue.date_enrolled",
"ccom.timecompleted",
"lip.name",
"ch.payment_status"
], $this->get_filter_columns($params));

$sql_columns = $this->get_columns($params, ["u.id"]);
$sql_having = $this->get_filter_sql($params, $columns, false);
$sql_order = $this->get_order_sql($params, $columns);


$sqlcoursefilter1 = $this->get_filter_in_sql($params->courseid, "e1.courseid");
$sql_filter = $this->get_filter_in_sql($params->courseid, "c.id");
$vendorsemailssql = get_operator('GROUP_CONCAT', 'DISTINCT vman.email', ['separator' => ', ']);
$vendorsnamessql = get_operator('GROUP_CONCAT', 'DISTINCT vnd.name', ['separator' => ', ']);
$vendorsidnumberssql = get_operator('GROUP_CONCAT', 'DISTINCT vnd.idnumber', ['separator' => ', ']);

if ($params->custom) {
$sql_filter .= $this->get_filterdate_sql($params, "ccom.timecompleted");
} else {
$sql_filter .= $this->get_filterdate_sql($params, "ue.date_enrolled");
}

$sqlvendorfilter = '';

if ($params->custom2) {
$sqlvendorfilter = $this->get_filter_in_sql($params->custom2, "vnd.id");;
}

return $this->get_report_data(
"SELECT CONCAT(lil.id, '_', c.id) AS id, vendor_ic.vendors_names, vendor_ic.emails AS company_emails,
vendor_ic.vendors_idnumbers AS tenants_ids, u.firstname, u.lastname, u.email, cc.name AS category,
c.fullname AS course, ue.date_enrolled, ccom.timecompleted, ch.payment_status AS status,
CASE WHEN lip.name IS NULL THEN 'invoice' ELSE lip.name END AS payment_method
{$sql_columns}
FROM {local_intellicart_logs} lil
JOIN {local_intellicart_relations} lir ON lir.productid = lil.instanceid AND lir.type = 'course'
JOIN (SELECT liv.instanceid, {$vendorsidnumberssql} AS vendors_idnumbers,
{$vendorsnamessql} AS vendors_names, {$vendorsemailssql} AS emails
FROM {local_intellicart_vrelations} liv
JOIN {local_intellicart_vendors} vnd ON vnd.id = liv.vendorid
LEFT JOIN (SELECT liu.instanceid, u.email
FROM {local_intellicart_users} liu
JOIN {user} u ON u.id = liu.userid
WHERE liu.role = 'manager' AND liu.type = 'vendor'
) vman ON vman.instanceid = vnd.id
WHERE liv.type = 'product' {$sqlvendorfilter}
GROUP BY liv.instanceid
) vendor_ic ON vendor_ic.instanceid = lir.productid
JOIN {local_intellicart_checkout} ch ON ch.id = lil.checkoutid
JOIN {user} u ON u.id = lil.userid
JOIN {course} c ON c.id = lir.instanceid
JOIN {course_categories} cc ON cc.id = c.category
LEFT JOIN {local_intellicart_payments} lip ON lip.id = ch.paymentid
LEFT JOIN (SELECT ue1.userid, e1.courseid,
CASE WHEN MIN(ue1.timestart) > 0 THEN MIN(ue1.timestart) ELSE MIN(ue1.timecreated) END AS date_enrolled
FROM {user_enrolments} ue1
JOIN {enrol} e1 ON e1.id = ue1.enrolid
WHERE ue1.id > 0 {$sqlcoursefilter1}
GROUP BY ue1.userid, e1.courseid
) ue ON ue.userid = u.id AND ue.courseid = c.id
LEFT JOIN {course_completions} ccom ON ccom.course = c.id AND ccom.userid = u.id
WHERE lil.type = 'product' {$sql_filter} {$sql_having} {$sql_order}", $params
);
}
}
4 changes: 2 additions & 2 deletions index.php
Expand Up @@ -246,7 +246,7 @@
</div>
<?php endif; ?>

<div class="intelliboard-box">
<div class="intelliboard-box admin-dashboard-intelliboard-box">
<?php if($settingUserSiteSummary): ?>
<div class="box<?php echo $settingCourseEnrollmentsTypes ? '60' : '100'; ?> pull-left">
<h3><?php echo get_string('user_site_summary_detail', 'local_intelliboard');?></h3>
Expand All @@ -261,7 +261,7 @@
</div>
<?php endif; ?>
</div>
<div class="intelliboard-box">
<div class="intelliboard-box admin-dashboard-intelliboard-box">
<?php if($settingUserMap): ?>
<div class="box<?php echo $settingEnrolComplOverview ? '45' : '100'; ?> pull-left">
<h3><?php echo get_string('user_map', 'local_intelliboard');?></h3>
Expand Down
2 changes: 1 addition & 1 deletion instructor/courses.php
Expand Up @@ -186,7 +186,7 @@

<a href="<?php echo $CFG->wwwroot.'/local/intelliboard/instructor/courses.php?search&action=activities&id='.$data->courseid; ?>" class="btn btn-default btn-back"><i class="ion-android-arrow-back"></i> <?php echo get_string('in201', 'local_intelliboard'); ?></a>
</ul>
<?php elseif($action === 'learners'): ?>
<?php elseif($action === 'learners' && $course): ?>
<div class="grade" title="<?php echo get_string('in21', 'local_intelliboard'); ?>">
<div class="circle-progress-course" data-percent="<?php echo ($scale_real>0)?$course->grade:(int)$course->grade; ?>"></div>
</div>
Expand Down
52 changes: 31 additions & 21 deletions instructor/lib.php
Expand Up @@ -75,27 +75,37 @@ function intelliboard_course_learners_total($courseid)
$sql44 = intelliboard_instructor_getcourses('gi.courseid', false, 'g.userid');
$sql55 = intelliboard_instructor_getcourses('c.id', false, 'ra.userid');

return $DB->get_record_sql("
SELECT c.id,c.fullname, c.startdate, c.enablecompletion,
(SELECT name FROM {course_categories} WHERE id = c.category) AS category,
(SELECT COUNT(id) FROM {course_sections} WHERE visible = 1 AND course = c.id) AS sections,
COUNT(DISTINCT ra.userid) as learners,
COUNT(DISTINCT cc.id) as learners_completed,
(SELECT $grade_avg
FROM {grade_items} gi
JOIN {grade_grades} g ON g.itemid = gi.id AND g.finalgrade IS NOT NULL
$join_group_sql2
WHERE gi.itemtype = 'course' AND gi.courseid = c.id $sql44) AS grade,
SUM(l.timespend) as timespend,
SUM(l.visits) as visits
FROM {role_assignments} ra
LEFT JOIN {context} e ON e.id = ra.contextid AND e.contextlevel = 50
LEFT JOIN {course} c ON c.id = e.instanceid
LEFT JOIN {course_completions} cc ON cc.course = c.id AND cc.userid = ra.userid AND cc.timecompleted > 0
LEFT JOIN (SELECT t.userid,t.courseid, SUM(t.timespend) as timespend, SUM(t.visits) as visits FROM
{local_intelliboard_tracking} t GROUP BY t.courseid, t.userid) l ON l.courseid = c.id AND l.userid = ra.userid
$join_group_sql
WHERE ra.roleid $sql_roles AND e.instanceid = :courseid $sql55 GROUP BY c.id LIMIT 1", $params);
$cache = cache::make('local_intelliboard', 'instructor_course_data');

if ($cache->has("total_{$courseid}")) {
$data = json_decode($cache->get("total_{$courseid}"));
} else {
$data = $DB->get_record_sql("
SELECT c.id,c.fullname, c.startdate, c.enablecompletion,
(SELECT name FROM {course_categories} WHERE id = c.category) AS category,
(SELECT COUNT(id) FROM {course_sections} WHERE visible = 1 AND course = c.id) AS sections,
COUNT(DISTINCT ra.userid) as learners,
COUNT(DISTINCT cc.id) as learners_completed,
(SELECT $grade_avg
FROM {grade_items} gi
JOIN {grade_grades} g ON g.itemid = gi.id AND g.finalgrade IS NOT NULL
$join_group_sql2
WHERE gi.itemtype = 'course' AND gi.courseid = c.id $sql44) AS grade,
SUM(l.timespend) as timespend,
SUM(l.visits) as visits
FROM {role_assignments} ra
LEFT JOIN {context} e ON e.id = ra.contextid AND e.contextlevel = 50
LEFT JOIN {course} c ON c.id = e.instanceid
LEFT JOIN {course_completions} cc ON cc.course = c.id AND cc.userid = ra.userid AND cc.timecompleted > 0
LEFT JOIN (SELECT t.userid,t.courseid, SUM(t.timespend) as timespend, SUM(t.visits) as visits FROM
{local_intelliboard_tracking} t GROUP BY t.courseid, t.userid) l ON l.courseid = c.id AND l.userid = ra.userid
$join_group_sql
WHERE ra.roleid $sql_roles AND e.instanceid = :courseid $sql55 GROUP BY c.id LIMIT 1", $params);

$cache->set("total_{$courseid}", json_encode($data));
}

return $data;
}

function intelliboard_learner_data($userid, $courseid)
Expand Down

0 comments on commit 432e8dd

Please sign in to comment.