} // Get the date the grade was entered if (isset($grades[$this->member->get('id')]['assets'][$asset->id]) && !is_null($grades[$this->member->get('id')]['assets'][$asset->id]['date'])) { $date = Date::of($grades[$this->member->get('id')]['assets'][$asset->id]['date'])->format('r'); } else { $date = "N/A"; } if (isset($asset->unit_id) && $asset->unit_id) { $details['forms'][$unit->get('id')][] = array('title' => $title, 'score' => $score, 'date' => $date, 'url' => $url); } else { $details['aux'][] = array('title' => $asset->title, 'score' => $score, 'date' => $date); } $isValidForm = false; } if ($isValidForm) { $dep = PdfFormDeployment::fromCrumb($crumb, $this->course->offering()->section()->get('id')); switch ($dep->getState()) { // Form isn't available yet case 'pending': $details['forms'][$unit->get('id')][] = array('title' => $title, 'score' => 'Not yet open', 'date' => 'N/A', 'url' => $url); break; // Form availability has expired // Form availability has expired case 'expired': // Get whether or not we should show scores at this point $results_closed = $dep->getResultsClosed(); // Form is still active and they are allowed to see their score if ($results_closed == 'score' || $results_closed == 'details') { $score = $grades[$this->member->get('id')]['assets'][$asset->id]['score']; } else { // Score has been withheld by form creator
/** * Query to sync form scores with gradebook * * @param obj $course * @param array $member_id * @return void */ public function syncGrades($course, $member_id = null) { if (!is_null($member_id) && !empty($member_id)) { if (!is_array($member_id)) { $member_id = (array) $member_id; } } else { // Pull all section members $members = $course->offering()->section()->members(array('student' => 1)); $member_id = array(); // Get member id's for refresh filter foreach ($members as $member) { $member_id[] = $member->get('id'); } } if (count($member_id) == 0) { return; } // Get the assets $asset = new Asset($this->_db); $assets = $asset->find(array('w' => array('course_id' => $course->get('id'), 'section_id' => $course->offering()->section()->get('id'), 'offering_id' => $course->offering()->get('id'), 'asset_type' => 'form'))); // Query for existing data $query = "SELECT * FROM `#__courses_grade_book` WHERE `member_id` IN (" . implode(',', $member_id) . ") AND `scope` IN ('asset')"; $this->_db->setQuery($query); $results = $this->_db->loadObjectList(); $existing_grades = array(); foreach ($results as $r) { $existing_grades[$r->member_id . '.' . $r->scope_id] = array('id' => $r->id, 'score' => $r->score); } $inserts = array(); $updates = array(); $deletes = array(); if (count($assets) > 0) { foreach ($assets as $asset) { // Add null values for unpublished forms that may have already been taken if ($asset->state != 1) { $deletes[] = $asset->id; continue; } $crumb = false; // Check for result for given student on form $crumb = $asset->url; if (!$crumb || strlen($crumb) != 20 || $asset->state != 1) { // Break foreach, this is not a valid form! continue; } $dep = \PdfFormDeployment::fromCrumb($crumb, $course->offering()->section()->get('id')); $results = $dep->getResults('member_id', $member_id); switch ($dep->getState()) { // Form isn't available yet case 'pending': // Null value foreach ($member_id as $u) { $key = $u . '.' . $asset->id; if (!array_key_exists($key, $existing_grades)) { $inserts[] = "('{$u}', NULL, 'asset', '{$asset->id}', NULL)"; } else { if (!is_null($existing_grades[$key]['score'])) { $updates[] = "UPDATE `#__courses_grade_book` SET `score` = NULL WHERE `id` = '" . $existing_grades[$key]['id'] . "'"; } } } break; // Form availability has expired - students either get a 0, or their score (no nulls) // Form availability has expired - students either get a 0, or their score (no nulls) case 'expired': foreach ($member_id as $u) { $score = isset($results[$u]['score']) ? $results[$u]['score'] : '0.00'; $finished = isset($results[$u]['finished']) ? '\'' . $results[$u]['finished'] . '\'' : 'NULL'; $key = $u . '.' . $asset->id; if (!array_key_exists($key, $existing_grades)) { $inserts[] = "('{$u}', '{$score}', 'asset', '{$asset->id}', {$finished})"; } else { if ($existing_grades[$key]['score'] != $score) { $updates[] = "UPDATE `#__courses_grade_book` SET `score` = '{$score}', `score_recorded` = {$finished} WHERE `id` = '" . $existing_grades[$key]['id'] . "'"; } } } break; // Form is still active - students either get their score, or a null // Form is still active - students either get their score, or a null case 'active': foreach ($member_id as $u) { $resp = $dep->getRespondent($u); // Form is active and they have completed it! if ($resp->getEndTime() && $resp->getEndTime() != '') { $score = isset($results[$u]['score']) ? '\'' . $results[$u]['score'] . '\'' : 'NULL'; $key = $u . '.' . $asset->id; if (!array_key_exists($key, $existing_grades)) { $inserts[] = "('{$u}', {$score}, 'asset', '{$asset->id}', '" . $results[$u]['finished'] . "')"; } else { if ($existing_grades[$key]['score'] != $score) { $updates[] = "UPDATE `#__courses_grade_book` SET `score` = {$score}, `score_recorded` = '" . $results[$u]['finished'] . "' WHERE `id` = '" . $existing_grades[$key]['id'] . "'"; } } } else { $key = $u . '.' . $asset->id; if (!array_key_exists($key, $existing_grades)) { $inserts[] = "('{$u}', NULL, 'asset', '{$asset->id}', NULL)"; } else { if (!is_null($existing_grades[$key]['score'])) { $updates[] = "UPDATE `#__courses_grade_book` SET `score` = NULL, `score_recorded` = NULL WHERE `id` = '" . $existing_grades[$key]['id'] . "'"; } } } } break; } } // Build query and run if (count($inserts) > 0) { $query = "INSERT INTO `#__courses_grade_book` (`member_id`, `score`, `scope`, `scope_id`, `score_recorded`) VALUES\n"; $query .= implode(",\n", $inserts); $this->_db->setQuery($query); $this->_db->query(); } if (count($updates) > 0) { foreach ($updates as $update) { $query = $update; $this->_db->setQuery($query); $this->_db->query(); } } if (count($deletes) > 0) { $query = "DELETE FROM `#__courses_grade_book` WHERE `scope` = 'asset' AND `scope_id` IN (" . implode(',', $deletes) . ")"; $this->_db->setQuery($query); $this->_db->query(); } } }