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