/**
  * Show Tutors/Students enrolled on a particular course with Turnitin
  *
  * @global type $CFG
  * @global type $OUTPUT
  * @global type $DB
  * @param type $cm course module data
  * @param type $turnitintooltwoassignment the assignment object
  * @param array $members of the course in Turnitin
  * @return array $memberdata in a format to be shown as rows in a datatable
  */
 public function get_tii_members_by_role($cm, $turnitintooltwoassignment, $members, $role = "Learner")
 {
     global $CFG, $DB, $OUTPUT;
     switch ($role) {
         case "Learner":
             $removestr = get_string('turnitinstudentsremove', 'turnitintooltwo');
             $removeaction = "removestudent";
             $do = "students";
             break;
         case "Instructor":
             $removestr = get_string('turnitintutorsremove', 'turnitintooltwo');
             $removeaction = "removetutor";
             $do = "tutors";
             break;
     }
     $memberdata = array();
     foreach ($members as $k => $v) {
         $membermoodleid = turnitintooltwo_user::get_moodle_user_id($k);
         if ($membermoodleid > 0) {
             $user = $DB->get_record('user', array('id' => $membermoodleid));
             $deleteurl = new moodle_url($CFG->wwwroot . "/mod/turnitintooltwo/view.php", array('id' => $cm->id, 'do' => $do, 'sesskey' => sesskey(), 'action' => $removeaction, 'membership_id' => $v['membership_id']));
             $attributes["onclick"] = 'return confirm(\'' . $removestr . '\');';
             $link = html_writer::link($deleteurl, html_writer::tag('i', '', array('class' => 'fa fa-trash-o fa-lg')), $attributes);
             $userdetails = html_writer::link($CFG->wwwroot . '/user/view.php?id=' . $membermoodleid . '&course=' . $turnitintooltwoassignment->turnitintooltwo->course, format_string($v['lastname']) . ', ' . format_string($v['firstname'])) . ' (' . $user->username . ')';
             $memberdata[] = array($link, $userdetails);
         }
     }
     return $memberdata;
 }
 /**
  * Enrol All students on a course, checks to see if all the Moodle students
  * are already enrolled and then enrols the students who aren't
  *
  * @param object $cm the course module
  * @return boolean
  */
 public function enrol_all_students($cm)
 {
     // Get Moodle Course Object.
     $course = $this->get_course_data($this->turnitintooltwo->course);
     // Get local course members.
     $moodleclassmembers = $this->get_moodle_course_users($cm);
     // Get the user ids of who is already enrolled and remove them
     // from the local course members array.
     $tiiclassmemberships = $this->get_class_memberships($course->turnitin_cid);
     $turnitincomms = new turnitintooltwo_comms();
     $turnitincall = $turnitincomms->initialise_api();
     $membership = new TiiMembership();
     $membership->setMembershipIds($tiiclassmemberships);
     try {
         $response = $turnitincall->readMemberships($membership);
         $readmemberships = $response->getMemberships();
         foreach ($readmemberships as $readmembership) {
             if ($readmembership->getRole() == "Learner") {
                 $moodleuserid = turnitintooltwo_user::get_moodle_user_id($readmembership->getUserId());
                 unset($moodleclassmembers[$moodleuserid]);
             }
         }
     } catch (Exception $e) {
         $turnitincomms->handle_exceptions($e, 'membercheckerror');
     }
     // Enrol remaining unenrolled users to the course.
     $members = array_keys($moodleclassmembers);
     foreach ($members as $member) {
         $user = new turnitintooltwo_user($member, "Learner");
         $user->join_user_to_class($course->turnitin_cid);
     }
     return true;
 }
 /**
  * Save updated submission data from Turnitin to the database
  *
  * @global type $DB
  * @param type $tiisubmissiondata
  * @param type $bulk
  * @param type $save - save in db regardless of changes
  * @return type
  */
 public function save_updated_submission_data($tiisubmissiondata, $bulk = false, $save = false)
 {
     global $DB, $CFG;
     static $part;
     static $tiiassignid;
     if ($tiiassignid != $tiisubmissiondata->getAssignmentId() || empty($part)) {
         $part = $DB->get_record("turnitintooltwo_parts", array("tiiassignid" => $tiisubmissiondata->getAssignmentId()));
     }
     $turnitintooltwoassignment = new turnitintooltwo_assignment($part->turnitintooltwoid);
     $sub = new stdClass();
     $sub->submission_title = $tiisubmissiondata->getTitle();
     $sub->submission_part = $part->id;
     $sub->submission_objectid = $tiisubmissiondata->getSubmissionId();
     $sub->turnitintooltwoid = $turnitintooltwoassignment->turnitintooltwo->id;
     $sub->submission_score = is_numeric($tiisubmissiondata->getOverallSimilarity()) ? $tiisubmissiondata->getOverallSimilarity() : null;
     $sub->submission_transmatch = 0;
     if ($turnitintooltwoassignment->turnitintooltwo->transmatch == 1 && is_int($tiisubmissiondata->getTranslatedOverallSimilarity())) {
         if ($tiisubmissiondata->getTranslatedOverallSimilarity() > $tiisubmissiondata->getOverallSimilarity()) {
             $sub->submission_score = $tiisubmissiondata->getTranslatedOverallSimilarity();
             $sub->submission_transmatch = 1;
         }
     }
     $sub->submission_grade = $tiisubmissiondata->getGrade() == '' ? null : $tiisubmissiondata->getGrade();
     $sub->submission_gmimaged = $tiisubmissiondata->getFeedbackExists();
     $sub->submission_unanon = $tiisubmissiondata->getAnonymous() == 1 ? 0 : 1;
     $sub->submission_orcapable = $tiisubmissiondata->getOriginalityReportCapable() == 1 ? 1 : 0;
     $sub->submission_acceptnothing = $tiisubmissiondata->getAcceptNothingSubmission() == 1 ? 1 : 0;
     $sub->submission_unanonreason = $sub->submission_unanon == 1 ? urldecode($tiisubmissiondata->getAnonymousRevealReason()) : null;
     $sub->submission_modified = strtotime($tiisubmissiondata->getDate());
     $sub->translated_overall_similarity = $tiisubmissiondata->getTranslatedOverallSimilarity();
     $sub->submission_attempts = $tiisubmissiondata->getAuthorLastViewedFeedback() > 0 ? strtotime($tiisubmissiondata->getAuthorLastViewedFeedback()) : 0;
     // If save not passed in then only update if certain items have changed to save on database load.
     if ($this->submission_grade != $sub->submission_grade || $this->submission_score != $sub->submission_score || $this->submission_modified != $sub->submission_modified || $this->submission_attempts != $sub->submission_attempts || $this->submission_unanon != $sub->submission_unanon || $this->submission_part != $sub->submission_part) {
         $save = true;
     }
     $cm = get_coursemodule_from_instance("turnitintooltwo", $turnitintooltwoassignment->turnitintooltwo->id, $turnitintooltwoassignment->turnitintooltwo->course);
     if ($save) {
         // If the user is not a moodle user then get their name from Tii - only do this on initial save.
         $sub->userid = turnitintooltwo_user::get_moodle_user_id($tiisubmissiondata->getAuthorUserId());
         // If we have no user ID get it from the Moodle database by using their Turnitin e-mail address.
         if ($sub->userid == 0) {
             $tmpuser = new turnitintooltwo_user(0);
             $tmpuser->tii_user_id = $tiisubmissiondata->getAuthorUserId();
             $tiiuser = $tmpuser->set_user_values_from_tii();
             if ($userrecord = $DB->get_record('user', array('email' => $tiiuser["email"]))) {
                 $sub->userid = $userrecord->id;
             }
         }
         // Check if the user is enrolled.
         if ($sub->userid != 0) {
             $context = context_module::instance($cm->id);
             if (!is_enrolled($context, $sub->userid)) {
                 // Enroll the user as a student.
                 $enrol = enrol_get_plugin('manual');
                 $instance = $DB->get_record("enrol", array('courseid' => $cm->course, 'enrol' => 'manual'));
                 $enrol->enrol_user($instance, $sub->userid, 5);
             }
         }
         if ($sub->userid == 0 && empty($this->id)) {
             if ($tiisubmissiondata->getAuthorUserId() > 0) {
                 $sub->submission_nmuserid = $tiisubmissiondata->getAuthorUserId();
                 $tmpuser = new turnitintooltwo_user(0);
                 $tmpuser->tii_user_id = $tiisubmissiondata->getAuthorUserId();
                 $tiiuser = $tmpuser->set_user_values_from_tii();
                 $sub->submission_nmfirstname = $tiiuser["firstname"];
                 $sub->submission_nmlastname = $tiiuser["lastname"];
             } else {
                 $sub->submission_nmuserid = "nm-" . $tiisubmissiondata->getAuthorUserId();
                 $sub->submission_nmfirstname = '';
                 $sub->submission_nmlastname = get_string('nonmoodleuser', 'turnitintooltwo');
             }
         }
         if (!empty($this->id)) {
             $sub->id = $this->id;
             $DB->update_record("turnitintooltwo_submissions", $sub, $bulk);
         } else {
             $sub->id = $DB->insert_record("turnitintooltwo_submissions", $sub, true, $bulk);
         }
         // Update gradebook.
         @(include_once $CFG->libdir . "/gradelib.php");
         if ($sub->userid > 0 && $sub->submission_unanon) {
             $user = new turnitintooltwo_user($sub->userid, "Learner");
             $grades = new stdClass();
             // Only add to gradebook if author has been unanonymised or assignment doesn't have anonymous marking
             if ($submissions = $DB->get_records('turnitintooltwo_submissions', array('turnitintooltwoid' => $turnitintooltwoassignment->turnitintooltwo->id, 'userid' => $user->id, 'submission_unanon' => 1))) {
                 $overallgrade = $turnitintooltwoassignment->get_overall_grade($submissions);
                 if ($turnitintooltwoassignment->turnitintooltwo->grade < 0) {
                     // Using a scale.
                     $grades->rawgrade = $overallgrade == '--' ? null : $overallgrade;
                 } else {
                     $grades->rawgrade = $overallgrade == '--' ? null : number_format($overallgrade, 2);
                 }
             }
             $grades->userid = $user->id;
             $params['idnumber'] = $cm->idnumber;
             grade_update('mod/turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->course, 'mod', 'turnitintooltwo', $turnitintooltwoassignment->turnitintooltwo->id, 0, $grades, $params);
         }
     }
 }