19 declare(strict_types=1);
85 $factory = new \ilTestEvaluationFactory($this->db, $this->test);
86 $participants = $factory->getCorrectionsEvaluationData()->getParticipants();
88 foreach ($participants as $active_id => $userdata) {
89 if (is_object($userdata) && is_array($userdata->getPasses())) {
93 $userdata->getUserID()
106 ->getCompleteEvaluationData()
107 ->getParticipant($active_id);
110 $user_data->getPass($pass),
111 $user_data->getUserID(),
115 $this->test->updateTestResultCache($active_id);
121 foreach ($passes as $pass => $passdata) {
122 if (is_object($passdata)) {
126 $this->test->updateTestResultCache($active_id);
136 foreach ($questions as $question_data) {
149 if ($this->preserve_manual_scores ===
true && $questiondata[
'manual'] === 1) {
153 $q_id = $questiondata[
'id'];
154 if (!isset($this->question_cache[$q_id])) {
155 $this->question_cache[$q_id] = $this->test->createQuestionGUI(
'', $q_id)->getObject();
157 $question = $this->question_cache[$q_id];
159 $old_points = $question->getReachedPoints($active_id, $pass);
160 $reached = $question->adjustReachedPointsByScoringOptions(
161 $question->calculateReachedPoints($active_id, $pass),
171 $question->getMaximumPoints(),
189 bool $manual_scoring =
false 192 $has_changed = $old_points !== $points;
193 if ($has_changed && $points <= $max_points) {
209 $data = $this->test->getQuestionCountAndPointsForPassOfParticipant($active_id, $pass);
216 $result = $this->db->queryF(
217 'SELECT SUM(points) reachedpoints FROM tst_test_result WHERE active_fi = %s AND pass = %s',
231 $logger = $this->test->getTestLogger();
232 if ($logger->isLoggingEnabled()) {
233 $logger->logScoringInteraction(
235 $this->test->getRefId(),
237 $this->scorer->getId(),
250 public function calculateBestSolutionForTest():
string 253 foreach ($this->test->getAllQuestions() as $question) {
255 $question_gui = $this->test->createQuestionGUI(
"", $question[
'question_id']);
256 $solution .=
'<h1>' . $question_gui->getObject()->getTitleForHTMLOutput() .
'</h1>';
257 $solution .= $question_gui->getSolutionOutput(0, null,
true,
true,
false,
false,
true,
false);
265 $query =
"DELETE FROM tst_test_result WHERE question_fi = %s";
266 $this->db->manipulateF($query, [
'integer'], [$question_id]);
275 foreach ($active_ids as $active_id) {
276 $passSelector = new \ilTestPassesSelector($this->db, $this->test);
277 $passSelector->setActiveId($active_id);
279 foreach ($passSelector->getExistingPasses() as $pass) {
280 $this->test->updateTestPassResults($active_id, $pass);
283 $this->test->updateTestResultCache($active_id);
290 SELECT COUNT(*) num_manual_scorings 291 FROM tst_test_result tres 292 INNER JOIN tst_active tact 293 ON tact.active_id = tres.active_fi 294 WHERE tact.test_fi = %s 298 $types = [
'integer'];
299 $values = [$this->test->getTestId()];
303 AND tres.question_fi = %s 306 $types[] =
'integer';
310 $res = $this->db->queryF($query, $types, $values);
312 while ($row = $this->db->fetchAssoc(
$res)) {
313 return (
int) $row[
'num_manual_scorings'];
recalculatePasses(\ilTestEvaluationUserData $userdata, int $active_id)
__construct(private \ilObjTest $test, private \ilObjUser $scorer, private \ilDBInterface $db, private \ilLanguage $lng)
setQuestionId(int $question_id)
TestScoringInteractionTypes
removeAllQuestionResults($question_id)
updatePassAndTestResults(array $active_ids)
recalculateQuestionScore(int $user_id, int $active_id, int $pass, array $questiondata)
recalculateSolution(int $active_id, int $pass)
recalculatePass(\ilTestEvaluationPassData $passdata, int $user_id, int $active_id, int $pass)
getPreserveManualScores()
static _updateObjectiveResult(int $a_user_id, int $a_active_id, int $a_question_id)
bool $preserve_manual_scores
setPreserveManualScores(bool $preserve_manual_scores)
static _updateStatus(int $a_obj_id, int $a_usr_id, ?object $a_obj=null, bool $a_percentage=false, bool $a_force_raise=false)
updateReachedPoints(int $user_id, int $active_id, int $question_id, float $old_points, float $points, float $max_points, int $pass, bool $manual_scoring=false)
This is an optimized version of ::_setReachedPoints that only executes updates in the database if nec...