/**
  * Update all the assignment submissions with data from Turnitin
  *
  * @param object $part
  * @param object $start position in submissions array to get details from
  */
 private function update_submissions_from_tii($part, $start = 0)
 {
     // Initialise Comms Object.
     $turnitincomms = new turnitintooltwo_comms();
     $turnitincall = $turnitincomms->initialise_api();
     try {
         $submission = new TiiSubmission();
         $submission->setSubmissionIds(array_slice($_SESSION["TiiSubmissions"][$part->id], $start, TURNITINTOOLTWO_SUBMISSION_GET_LIMIT));
         $response = $turnitincall->readSubmissions($submission);
         $readsubmissions = $response->getSubmissions();
         foreach ($readsubmissions as $readsubmission) {
             $turnitintooltwosubmission = new turnitintooltwo_submission($readsubmission->getSubmissionId(), "turnitin", $this, $part->id);
             $turnitintooltwosubmission->save_updated_submission_data($readsubmission, true);
         }
     } catch (Exception $e) {
         $turnitincomms->handle_exceptions($e, 'tiisubmissiongeterror');
     }
 }
 /**
  * Update simliarity scores.
  *
  * @return boolean
  */
 public function cron_update_scores($submissiontype = 'file')
 {
     global $DB, $CFG;
     $typefield = $CFG->dbtype == "oci" ? " to_char(submissiontype) " : " submissiontype ";
     $submissions = $DB->get_records_select('plagiarism_turnitin_files', " statuscode = ? AND " . $typefield . " = ? AND similarityscore IS NULL AND ( orcapable = ? OR orcapable IS NULL ) ", array('success', $submissiontype, 1), 'externalid DESC');
     $submissionids = array();
     $reportsexpected = array();
     // Add submission ids to the request.
     foreach ($submissions as $tiisubmission) {
         // Only add the submission to the request if the module still exists.
         if ($cm = get_coursemodule_from_id('', $tiisubmission->cm)) {
             if (!isset($reportsexpected[$cm->id])) {
                 $plagiarismsettings = $this->get_settings($cm->id);
                 $reportsexpected[$cm->id] = 1;
                 if (!isset($plagiarismsettings['plagiarism_compare_institution'])) {
                     $plagiarismsettings['plagiarism_compare_institution'] = 0;
                 }
                 // Don't add the submission to the request if module settings mean we will not get a report back.
                 if ($plagiarismsettings['plagiarism_compare_student_papers'] == 0 && $plagiarismsettings['plagiarism_compare_internet'] == 0 && $plagiarismsettings['plagiarism_compare_journals'] == 0 && $plagiarismsettings['plagiarism_compare_institution'] == 0) {
                     $reportsexpected[$cm->id] = 0;
                 }
             }
             // Only add the submission to the request if we are expecting an originality report.
             if ($reportsexpected[$cm->id] == 1) {
                 $submissionids[] = $tiisubmission->externalid;
             }
         }
     }
     if (count($submissionids) > 0) {
         // Process submissions in batches, depending on the max. number of submissions the Turnitin API returns.
         $submissionbatches = array_chunk($submissionids, PLAGIARISM_TURNITIN_NUM_RECORDS_RETURN);
         foreach ($submissionbatches as $submissionsbatch) {
             // Initialise Comms Object.
             $turnitincomms = new turnitin_comms();
             $turnitincall = $turnitincomms->initialise_api();
             try {
                 $submission = new TiiSubmission();
                 // Use $submissionsbatch array instead of original $submissionids.
                 $submission->setSubmissionIds($submissionsbatch);
                 $response = $turnitincall->readSubmissions($submission);
                 $readsubmissions = $response->getSubmissions();
                 foreach ($readsubmissions as $readsubmission) {
                     // Catch exceptions thrown by getSubmissionId to allow rest of the
                     // submissions to get processed.
                     try {
                         $tiisubmissionid = (int) $readsubmission->getSubmissionId();
                         $currentsubmission = $DB->get_record('plagiarism_turnitin_files', array('externalid' => $tiisubmissionid), 'id, cm, externalid, userid');
                         if ($cm = get_coursemodule_from_id('', $currentsubmission->cm)) {
                             $plagiarismfile = new object();
                             $plagiarismfile->id = $currentsubmission->id;
                             $plagiarismfile->externalid = $tiisubmissionid;
                             $plagiarismfile->similarityscore = is_numeric($readsubmission->getOverallSimilarity()) ? $readsubmission->getOverallSimilarity() : null;
                             $plagiarismfile->grade = is_numeric($readsubmission->getGrade()) ? $readsubmission->getGrade() : null;
                             $plagiarismfile->orcapable = $readsubmission->getOriginalityReportCapable() == 1 ? 1 : 0;
                             $plagiarismfile->transmatch = 0;
                             if (is_int($readsubmission->getTranslatedOverallSimilarity()) && $readsubmission->getTranslatedOverallSimilarity() > $readsubmission->getOverallSimilarity()) {
                                 $plagiarismfile->similarityscore = $readsubmission->getTranslatedOverallSimilarity();
                                 $plagiarismfile->transmatch = 1;
                             }
                             if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) {
                                 mtrace("File failed to update: " . $plagiarismfile->id);
                             } else {
                                 mtrace("File updated: " . $plagiarismfile->id);
                             }
                             if (!is_null($plagiarismfile->grade)) {
                                 $this->update_grade($cm, $readsubmission, $currentsubmission->userid);
                             }
                         }
                     } catch (Exception $e) {
                         mtrace("An exception was thrown while attempting to read submission {$tiisubmissionid}: " . $e->getMessage() . '(' . $e->getFile() . ':' . $e->getLine() . ')');
                     }
                 }
             } catch (Exception $e) {
                 mtrace(get_string('tiisubmissionsgeterror', 'turnitintooltwo'));
                 $turnitincomms->handle_exceptions($e, 'tiisubmissionsgeterror', false);
                 // Do not return false if a batch fails - another one might work.
             }
         }
     }
     return true;
 }
 /**
  * Update simliarity scores.
  * @param array $submissions - the submissions to be processed
  * @return boolean
  */
 public function cron_update_scores($submissiontype = 'file', $submissions)
 {
     global $DB, $CFG;
     $submissionids = array();
     $reportsexpected = array();
     // Add submission ids to the request.
     foreach ($submissions as $tiisubmission) {
         // Only add the submission to the request if the module still exists.
         if ($cm = get_coursemodule_from_id('', $tiisubmission->cm)) {
             // Updates the db field 'duedate_report_refresh' if the due date has passed within the last twenty four hours.
             $moduledata = $DB->get_record($cm->modname, array('id' => $cm->instance));
             $now = strtotime('now');
             $dtdue = !empty($moduledata->duedate) ? $moduledata->duedate : 0;
             if ($now >= $dtdue && $now < strtotime('+1 day', $dtdue)) {
                 $this->set_duedate_report_refresh($tiisubmission->id, 1);
             }
             if (!isset($reportsexpected[$cm->id])) {
                 $plagiarismsettings = $this->get_settings($cm->id);
                 $reportsexpected[$cm->id] = 1;
                 if (!isset($plagiarismsettings['plagiarism_compare_institution'])) {
                     $plagiarismsettings['plagiarism_compare_institution'] = 0;
                 }
                 // Don't add the submission to the request if module settings mean we will not get a report back.
                 if (array_key_exists('plagiarism_compare_student_papers', $plagiarismsettings) && $plagiarismsettings['plagiarism_compare_student_papers'] == 0 && $plagiarismsettings['plagiarism_compare_internet'] == 0 && $plagiarismsettings['plagiarism_compare_journals'] == 0 && $plagiarismsettings['plagiarism_compare_institution'] == 0) {
                     $reportsexpected[$cm->id] = 0;
                 }
             }
             // Only add the submission to the request if we are expecting an originality report.
             if ($reportsexpected[$cm->id] == 1) {
                 $submissionids[] = $tiisubmission->externalid;
             }
         }
     }
     if (count($submissionids) > 0) {
         // Process submissions in batches, depending on the max. number of submissions the Turnitin API returns.
         $submissionbatches = array_chunk($submissionids, PLAGIARISM_TURNITIN_NUM_RECORDS_RETURN);
         foreach ($submissionbatches as $submissionsbatch) {
             // Initialise Comms Object.
             $turnitincomms = new turnitin_comms();
             $turnitincall = $turnitincomms->initialise_api();
             try {
                 $submission = new TiiSubmission();
                 // Use $submissionsbatch array instead of original $submissionids.
                 $submission->setSubmissionIds($submissionsbatch);
                 $response = $turnitincall->readSubmissions($submission);
                 $readsubmissions = $response->getSubmissions();
                 foreach ($readsubmissions as $readsubmission) {
                     // Catch exceptions thrown by getSubmissionId to allow rest of the
                     // submissions to get processed.
                     try {
                         $tiisubmissionid = (int) $readsubmission->getSubmissionId();
                         $currentsubmission = $DB->get_record('plagiarism_turnitin_files', array('externalid' => $tiisubmissionid), 'id, cm, externalid, userid');
                         if ($cm = get_coursemodule_from_id('', $currentsubmission->cm)) {
                             $plagiarismfile = new stdClass();
                             $plagiarismfile->id = $currentsubmission->id;
                             $plagiarismfile->externalid = $tiisubmissionid;
                             $plagiarismfile->similarityscore = is_numeric($readsubmission->getOverallSimilarity()) ? $readsubmission->getOverallSimilarity() : null;
                             $plagiarismfile->grade = is_numeric($readsubmission->getGrade()) ? $readsubmission->getGrade() : null;
                             $plagiarismfile->orcapable = $readsubmission->getOriginalityReportCapable() == 1 ? 1 : 0;
                             $plagiarismfile->transmatch = 0;
                             if (is_int($readsubmission->getTranslatedOverallSimilarity()) && $readsubmission->getTranslatedOverallSimilarity() > $readsubmission->getOverallSimilarity()) {
                                 $plagiarismfile->similarityscore = $readsubmission->getTranslatedOverallSimilarity();
                                 $plagiarismfile->transmatch = 1;
                             }
                             if (!$DB->update_record('plagiarism_turnitin_files', $plagiarismfile)) {
                                 mtrace("File failed to update: " . $plagiarismfile->id);
                             } else {
                                 mtrace("File updated: " . $plagiarismfile->id);
                             }
                             if (!is_null($plagiarismfile->grade)) {
                                 $this->update_grade($cm, $readsubmission, $currentsubmission->userid);
                             }
                         }
                     } catch (Exception $e) {
                         mtrace("An exception was thrown while attempting to read submission {$tiisubmissionid}: " . $e->getMessage() . '(' . $e->getFile() . ':' . $e->getLine() . ')');
                     }
                 }
             } catch (Exception $e) {
                 mtrace(get_string('tiisubmissionsgeterror', 'plagiarism_turnitin'));
                 $turnitincomms->handle_exceptions($e, 'tiisubmissionsgeterror', false);
                 // Do not return false if a batch fails - another one might work.
             }
         }
     }
     // Sets the duedate_report_refresh flag for each processed submission to 2 to prevent them being processed again in the next cron run
     foreach ($submissions as $tiisubmission) {
         if ($cm = get_coursemodule_from_id('', $tiisubmission->cm)) {
             $this->set_duedate_report_refresh($tiisubmission->id, 2);
         }
     }
     return true;
 }
 public function findRecentSubmissions($submission)
 {
     try {
         $query = json_encode(array('lineitem_sourcedid' => $submission->getAssignmentId(), 'date_from' => $submission->getDateFrom()));
         $soap = $this->discoverResultIds(array('queryObject' => $query));
         $response = new Response($this);
         if ($response->getStatus() == 'error') {
             throw new TurnitinSDKException($response->getStatusCode(), $response->getDescription());
         } else {
             $tiiSubmission = new TiiSubmission();
             $submissionids = array();
             if (isset($soap->sourcedIdSet->sourcedId)) {
                 if (!is_array($soap->sourcedIdSet->sourcedId)) {
                     $soap->sourcedIdSet->sourcedId = array($soap->sourcedIdSet->sourcedId);
                 }
                 foreach ($soap->sourcedIdSet->sourcedId as $id) {
                     $submissionids[] = $id;
                 }
             }
             $tiiSubmission->setSubmissionIds($submissionids);
             $response->setSubmission($tiiSubmission);
         }
         return $response;
     } catch (SoapFault $e) {
         throw new TurnitinSDKException($e->faultcode, $e->faultstring, parent::getLogPath());
     }
 }