- Модуль: learning
- Путь к файлу: ~/bitrix/modules/learning/classes/general/attempt.php
- Класс: CAllTestAttempt
- Вызов: CAllTestAttempt::IsTestCompleted
static function IsTestCompleted($ATTEMPT_ID, $PERCENT)
{
global $DB;
$strSql =
"SELECT * ".
"FROM b_learn_test_result TR, b_learn_question Q ".
"WHERE TR.QUESTION_ID = Q.ID AND TR.CORRECT = 'N' AND Q.CORRECT_REQUIRED = 'Y' AND TR.ATTEMPT_ID = '".intval($ATTEMPT_ID)."'";
if (!$res = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__))
return false;
if ($arStat = $res->Fetch())
return false;
$strSql =
"SELECT SUM(Q.POINT) as CNT_ALL, SUM(CASE WHEN TR.CORRECT = 'Y' THEN Q.POINT ELSE 0 END) as CNT_RIGHT ".
"FROM b_learn_test_result TR, b_learn_question Q ".
"WHERE TR.ATTEMPT_ID = '".intval($ATTEMPT_ID)."' AND TR.QUESTION_ID = Q.ID";
if (!$res = $DB->Query($strSql, false, "File: ".__FILE__."
Line: ".__LINE__))
return false;
if (!$arStat = $res->Fetch())
return false;
if($arStat["CNT_RIGHT"]<=0 || $arStat["CNT_ALL"] == 0)
return false;
// Do some magic due to IEEE 754
$epsilon = 0.001;
$scoreForSuccess = (float) ((int) $PERCENT);
$userScore = round( ($arStat["CNT_RIGHT"] / $arStat["CNT_ALL"]) * 100, 2);
$delta = abs($userScore - $scoreForSuccess);
$isTestComplete = false;
if ($userScore > $scoreForSuccess)
$isTestComplete = true;
elseif ($delta < $epsilon) // it means, that $userScore == $scoreForSuccess
$isTestComplete = true;
return ($isTestComplete);
}