guild/common/helpers/ScoreCalculatorHelper.php

109 lines
3.7 KiB
PHP
Raw Normal View History

2021-11-08 12:41:39 +03:00
<?php
namespace common\helpers;
use backend\modules\questionnaire\models\Answer;
use backend\modules\questionnaire\models\UserQuestionnaire;
use backend\modules\questionnaire\models\UserResponse;
use yii\helpers\ArrayHelper;
class ScoreCalculatorHelper
{
public static function rateResponses(UserQuestionnaire $user_questionnaire)
{
$responses = $user_questionnaire->getUserResponses()->all();
foreach ($responses as $response)
{
self::rateOneResponse($response);
}
}
public static function rateOneResponse(UserResponse $response)
{
if ($response->answer_flag === null && $response->getQuestionTypeValue() != 1) // not open question
{
$correct_answers = $response->getCorrectAnswers();
foreach ($correct_answers as $correct_answer)
{
if ($response->response_body === $correct_answer['answer_body'])
{
$response->answer_flag = 1;
$response->save();
return;
}
}
$response->answer_flag = 0;
$response->save();
}
}
public static function checkAnswerFlagsForNull(UserQuestionnaire $userQuestionnaire): bool
{
$responses = $userQuestionnaire->getUserResponses()->AsArray()->all();
foreach ($responses as $response)
{
if (ArrayHelper::isIn(null, $response))
return false;
}
return true;
}
public static function calculateScore(UserQuestionnaire $userQuestionnaire)
{
$responses_questions = $userQuestionnaire->hasMany(UserResponse::className(), ['user_questionnaire_uuid' => 'uuid'])
2021-11-08 12:41:39 +03:00
->joinWith('question')->asArray()->all();
$score = null;
$user_correct_answers_num = null;
foreach ($responses_questions as $response_question)
{
if(self::isCorrect($response_question['answer_flag']))
{
$user_correct_answers_num += 1;
switch ($response_question['question']['question_type_id'])
{
case '1': // open question
$score += $response_question['answer_flag'] * $response_question['question']['score'];
break;
case '2': // one answer
$score += $response_question['question']['score'];
break;
case '3': // multi answer
$score += $response_question['question']['score'] / self::correctAnswersNum($response_question['question']['id']);
break;
}
}
}
if($score !== null) {
self::setPercentCorrectAnswers($user_correct_answers_num, $userQuestionnaire);
$userQuestionnaire->score = round($score);
$userQuestionnaire->save();
}
}
protected static function isCorrect($answer_flag): bool
{
if ($answer_flag > 0) {
return true;
}
return false;
}
protected static function correctAnswersNum($question_id)
{
return Answer::numCorrectAnswers($question_id);
}
protected static function setPercentCorrectAnswers($user_correct_answers_num, UserQuestionnaire $userQuestionnaire)
{
$all_correct_answers_num = $userQuestionnaire->numCorrectAnswersWithoutOpenQuestions();
$all_correct_answers_num += $userQuestionnaire->numOpenQuestionsAnswers();
$percent = $user_correct_answers_num / $all_correct_answers_num;
$userQuestionnaire->percent_correct_answers = round($percent, 2);
$userQuestionnaire->save();
}
}