Example #1
0
 /**
  * Calculates the question results from a previously saved question solution
  *
  * @final
  * @global ilDB $ilDB
  * @global ilObjUser $ilUser
  * @param integer $active_id Active id of the user
  * @param integer $pass Test pass
  */
 public final function calculateResultsFromSolution($active_id, $pass = NULL, $obligationsEnabled = false)
 {
     global $ilDB, $ilUser;
     if (is_null($pass)) {
         include_once "./Modules/Test/classes/class.ilObjTest.php";
         $pass = ilObjTest::_getPass($active_id);
     }
     // determine reached points for submitted solution
     $reached_points = $this->calculateReachedPoints($active_id, $pass);
     // deduct points for requested hints from reached points
     require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintTracking.php';
     $questionHintTracking = new ilAssQuestionHintTracking($this->getId(), $active_id, $pass);
     $requestsStatisticData = $questionHintTracking->getRequestStatisticDataByQuestionAndTestpass();
     $reached_points = $reached_points - $requestsStatisticData->getRequestsPoints();
     // adjust reached points regarding to tests scoring options
     $reached_points = $this->adjustReachedPointsByScoringOptions($reached_points, $active_id, $pass);
     if ($obligationsEnabled && ilObjTest::isQuestionObligatory($this->getId())) {
         $isAnswered = $this->isAnswered($active_id, $pass);
     } else {
         $isAnswered = true;
     }
     if (is_null($reached_points)) {
         $reached_points = 0;
     }
     $this->getProcessLocker()->requestUserQuestionResultUpdateLock();
     $query = "\n\t\t\tDELETE FROM\t\ttst_test_result\n\t\t\t\n\t\t\tWHERE\t\t\tactive_fi = %s\n\t\t\tAND\t\t\t\tquestion_fi = %s\n\t\t\tAND\t\t\t\tpass = %s\n\t\t";
     $types = array('integer', 'integer', 'integer');
     $values = array($active_id, $this->getId(), $pass);
     if ($this->getStep() !== NULL) {
         $query .= "\n\t\t\t\tAND\t\t\t\tstep = %s\n\t\t\t";
         $types[] = 'integer';
         $values[] = $this->getStep();
     }
     $affectedRows = $ilDB->manipulateF($query, $types, $values);
     $next_id = $ilDB->nextId("tst_test_result");
     $fieldData = array('test_result_id' => array('integer', $next_id), 'active_fi' => array('integer', $active_id), 'question_fi' => array('integer', $this->getId()), 'pass' => array('integer', $pass), 'points' => array('float', $reached_points), 'tstamp' => array('integer', time()), 'hint_count' => array('integer', $requestsStatisticData->getRequestsCount()), 'hint_points' => array('float', $requestsStatisticData->getRequestsPoints()), 'answered' => array('integer', $isAnswered));
     if ($this->getStep() !== NULL) {
         $fieldData['step'] = array('integer', $this->getStep());
     }
     $ilDB->insert('tst_test_result', $fieldData);
     $this->getProcessLocker()->releaseUserQuestionResultUpdateLock();
     include_once "./Modules/Test/classes/class.ilObjAssessmentFolder.php";
     if (ilObjAssessmentFolder::_enabledAssessmentLogging()) {
         $this->logAction(sprintf($this->lng->txtlng("assessment", "log_user_answered_question", ilObjAssessmentFolder::_getLogLanguage()), $reached_points), $active_id, $this->getId());
     }
     // update test pass results
     $this->_updateTestPassResults($active_id, $pass, $obligationsEnabled, $this->getProcessLocker());
     // Update objective status
     include_once 'Modules/Course/classes/class.ilCourseObjectiveResult.php';
     ilCourseObjectiveResult::_updateObjectiveResult($ilUser->getId(), $active_id, $this->getId());
 }