29 'CHECK_PERMISSIONS' =>
'N'
89 $arInsert =
$DB->PrepareInsert(
"b_learn_attempt",
$arFields,
"learning");
112 if (
$ID < 1)
return false;
114 $bCheckRights =
true;
115 if (isset(
$arParams[
'CHECK_PERMISSIONS']) && (
$arParams[
'CHECK_PERMISSIONS'] ===
'N'))
116 $bCheckRights =
false;
127 $strUpdate =
$DB->PrepareUpdate(
"b_learn_attempt",
$arFields,
"learning");
128 $strSql =
"UPDATE b_learn_attempt SET ".$strUpdate.
" WHERE ID=".
$ID;
129 $DB->QueryBind($strSql, $arBinds);
145 if (
$ID < 1)
return false;
148 $strSql =
"DELETE FROM b_learn_test_result WHERE ATTEMPT_ID = ".$ID;
149 if (!
$DB->Query($strSql))
153 $strSql =
"DELETE FROM b_learn_attempt WHERE ID = ".$ID;
154 if (!
$DB->Query($strSql))
169 $arSqlSearch = Array();
175 $cOperationType =
$res[
"OPERATION"];
216 case "USER_LAST_NAME":
231 return (
new CDBResult());
235 public static function GetCount($TEST_ID, $STUDENT_ID)
240 "SELECT COUNT(*) as C ".
241 "FROM b_learn_attempt A ".
242 "WHERE A.TEST_ID = '".intval($TEST_ID).
"' AND A.STUDENT_ID = '".intval($STUDENT_ID).
"'";
245 $res_cnt =
$res->Fetch();
247 return intval($res_cnt[
"C"]);
257 "FROM b_learn_test_result TR, b_learn_question Q ".
258 "WHERE TR.QUESTION_ID = Q.ID AND TR.CORRECT = 'N' AND Q.CORRECT_REQUIRED = 'Y' AND TR.ATTEMPT_ID = '".intval($ATTEMPT_ID).
"'";
260 if (!
$res =
$DB->Query($strSql))
263 if ($arStat =
$res->Fetch())
267 "SELECT SUM(Q.POINT) as CNT_ALL, SUM(CASE WHEN TR.CORRECT = 'Y' THEN TR.POINT ELSE 0 END) as CNT_RIGHT ".
268 "FROM b_learn_test_result TR, b_learn_question Q ".
269 "WHERE TR.ATTEMPT_ID = '".intval($ATTEMPT_ID).
"' AND TR.QUESTION_ID = Q.ID";
271 if (!
$res =
$DB->Query($strSql))
274 if (!$arStat =
$res->Fetch())
277 if($arStat[
"CNT_RIGHT"]<=0 || $arStat[
"CNT_ALL"] == 0)
283 $scoreForSuccess = (float) ((
int) $PERCENT);
284 $userScore = round( ($arStat[
"CNT_RIGHT"] / $arStat[
"CNT_ALL"]) * 100, 2);
286 $delta = abs($userScore - $scoreForSuccess);
288 $isTestComplete =
false;
289 if ($userScore > $scoreForSuccess)
290 $isTestComplete =
true;
292 $isTestComplete =
true;
294 return ($isTestComplete);
302 $ATTEMPT_ID = intval($ATTEMPT_ID);
307 $strSql =
"SELECT A.*, T.APPROVED, T.COMPLETED_SCORE, T.COURSE_ID ".
308 "FROM b_learn_attempt A ".
309 "INNER JOIN b_learn_test T ON A.TEST_ID = T.ID ".
310 "WHERE A.ID = '".$ATTEMPT_ID.
"' AND A.STATUS = 'F' ";
312 if (!$arAttempt =
$res->Fetch())
318 $arAttempt[
"APPROVED"] ==
"Y" &&
319 intval($arAttempt[
"COMPLETED_SCORE"])>0 &&
328 "UPDATE b_learn_attempt SET COMPLETED = '".$COMPLETED.
"' ".
329 "WHERE ID = '".$ATTEMPT_ID.
"'";
331 if (!
$res =
$DB->Query($strSql))
334 $strSql =
"SELECT * FROM b_learn_gradebook WHERE STUDENT_ID='".$arAttempt[
"STUDENT_ID"].
"' AND TEST_ID='".$arAttempt[
"TEST_ID"].
"'";
336 if (!$arGradeBook =
$res->Fetch())
339 "STUDENT_ID" => $arAttempt[
"STUDENT_ID"],
340 "TEST_ID" => $arAttempt[
"TEST_ID"],
341 "RESULT" => $arAttempt[
"SCORE"],
342 "MAX_RESULT" => intval($arAttempt[
"MAX_SCORE"]),
343 "COMPLETED" => $COMPLETED,
356 "SELECT A.SCORE, A.MAX_SCORE FROM b_learn_attempt A ".
357 "WHERE A.STUDENT_ID = '".$arAttempt[
"STUDENT_ID"].
"' AND A.TEST_ID = '".$arAttempt[
"TEST_ID"].
"' ORDER BY COMPLETED DESC, SCORE DESC";
360 if (!$arMaxScore =
$res->Fetch())
363 if ($arGradeBook[
"COMPLETED"] ==
"Y")
367 "UPDATE b_learn_gradebook SET RESULT = '".intval($arMaxScore[
"SCORE"]).
"', MAX_RESULT = '".intval($arMaxScore[
"MAX_SCORE"]).
"',COMPLETED = '".$COMPLETED.
"' ".
368 "WHERE ID = '".$arGradeBook[
"ID"].
"'";
370 if (!
$res =
$DB->Query($strSql))
384 $ATTEMPT_ID = intval($ATTEMPT_ID);
390 "SELECT SUM(TR.POINT) as SCORE, SUM(Q.POINT) MAX_SCORE ".
391 "FROM b_learn_test_result TR ".
392 "INNER JOIN b_learn_question Q ON TR.QUESTION_ID = Q.ID ".
393 "WHERE ATTEMPT_ID = '".$ATTEMPT_ID.
"' ";
401 "SCORE" =>
$ar[
"SCORE"],
402 "MAX_SCORE" =>
$ar[
"MAX_SCORE"],
404 "~DATE_END"=>CDatabase::CurrentTimeFunction(),
408 foreach(
GetModuleEvents(
'learning',
'OnAfterAttemptFinished',
true) as $arEvent)
422 $ATTEMPT_ID = intval($ATTEMPT_ID);
427 $strSql =
"SELECT COUNT(*) CNT, SUM(TR.POINT) CNT_SUM, SUM(Q.POINT) MAX_POINT ".
428 "FROM b_learn_test_result TR ".
429 "INNER JOIN b_learn_question Q ON TR.QUESTION_ID = Q.ID ".
430 "WHERE TR.ATTEMPT_ID = ".$ATTEMPT_ID;
435 $strSql =
"UPDATE b_learn_attempt SET QUESTIONS = '".intval(
$ar[
"CNT"]).
"', SCORE = '".intval(
$ar[
"CNT_SUM"]).
"', MAX_SCORE = '".intval(
$ar[
"MAX_POINT"]).
"' WHERE ID = ".$ATTEMPT_ID;
436 if (!
$DB->Query($strSql))
449 "FROM b_learn_test_result TR, b_learn_question Q ".
450 "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).
"'";
453 if (!
$res =
$DB->Query($strSql))
456 if ($arStat =
$res->Fetch())
460 "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 ".
461 "FROM b_learn_test_result TR, b_learn_question Q ".
462 "WHERE TR.ATTEMPT_ID = '".intval($ATTEMPT_ID).
"' AND TR.QUESTION_ID = Q.ID";
464 if (!
$res =
$DB->Query($strSql))
467 if (!$arStat =
$res->Fetch())
470 if($arStat[
"CNT_ALL"] == 0)
474 elseif ($arStat[
"CNT_WRONG"]==0)
484 $cntNotFailed = $arStat[
"CNT_ALL"] - $arStat[
"CNT_WRONG"];
486 $scoreForSuccess = (float) ((
int) $PERCENT);
487 $userScore = round( ($cntNotFailed / $arStat[
"CNT_ALL"]) * 100, 2);
489 $delta = abs($userScore - $scoreForSuccess);
491 $isTestFailed =
true;
492 if ($userScore > $scoreForSuccess)
493 $isTestFailed =
false;
495 $isTestFailed =
false;
497 return ($isTestFailed);
506 $obUserFieldsSql->
SetEntity(
"LEARN_ATTEMPT",
"A.ID");
507 $obUserFieldsSql->SetSelect($arSelect);
509 $obUserFieldsSql->SetOrder($arOrder);
513 "TEST_ID" =>
"A.TEST_ID",
514 "OBY_DATE_END" =>
"A.DATE_END",
515 "STUDENT_ID" =>
"A.STUDENT_ID",
516 "DATE_START" =>
$DB->DateToCharFunction(
"A.DATE_START",
"FULL"),
517 "DATE_END" =>
$DB->DateToCharFunction(
"A.DATE_END",
"FULL"),
518 "STATUS" =>
"A.STATUS",
519 "COMPLETED" =>
"A.COMPLETED",
520 "SCORE" =>
"A.SCORE",
521 "MAX_SCORE" =>
"A.MAX_SCORE",
522 "QUESTIONS" =>
"A.QUESTIONS",
523 "TEST_NAME" =>
"T.NAME",
524 "USER_NAME" =>
$DB->Concat(
"'('",
'U.LOGIN',
"') '",
"CASE WHEN U.NAME IS NULL THEN '' ELSE U.NAME END",
"' '",
"CASE WHEN U.LAST_NAME IS NULL THEN '' ELSE U.LAST_NAME END"),
527 "MESSAGE" =>
"TM.DESCRIPTION",
528 "LINKED_LESSON_ID" =>
"C.LINKED_LESSON_ID",
529 "COURSE_ID" =>
"C.ID",
530 "SPEED" => self::getSpeedFieldSql()
533 if (
count($arSelect) <= 0 || in_array(
"*", $arSelect))
536 $arSqlSelect =
array();
537 foreach($arSelect as $field)
539 $field = mb_strtoupper($field);
541 $arSqlSelect[$field] =
$arFields[$field].
" AS ".$field;
544 $sSelect = implode(
",\n", $arSqlSelect);
552 $arSqlSearchCnt =
count($arSqlSearch);
553 for(
$i=0;
$i<$arSqlSearchCnt;
$i++)
554 if($arSqlSearch[
$i] <>
'')
555 $strSqlSearch .=
" AND ".$arSqlSearch[
$i].
" ";
557 $r = $obUserFieldsSql->GetFilter();
559 $strSqlSearch .=
" AND (".$r.
") ";
561 $bCheckPerm =
'ORPHANED VAR';
564 $strSql = static::_GetListSQLFormer($sSelect, $obUserFieldsSql, $bCheckPerm,
$USER,
$arFilter, $strSqlSearch, $strSqlFrom);
566 if (!is_array($arOrder))
570 foreach($arOrder as $by=>
$order)
572 $by = mb_strtolower($by);
578 $arSqlOrder[] =
" A.ID ".$order.
" ";
580 $arSqlOrder[] =
" A.TEST_ID ".$order.
" ";
581 elseif ($by ==
"student_id")
582 $arSqlOrder[] =
" A.STUDENT_ID ".$order.
" ";
583 elseif ($by ==
"date_start")
584 $arSqlOrder[] =
" A.DATE_START ".$order.
" ";
585 elseif ($by ==
"date_end")
586 $arSqlOrder[] =
" A.DATE_END ".$order.
" ";
588 $arSqlOrder[] =
" A.STATUS ".$order.
" ";
590 $arSqlOrder[] =
" A.SCORE ".$order.
" ";
591 elseif ($by ==
"max_score")
592 $arSqlOrder[] =
" A.MAX_SCORE ".$order.
" ";
593 elseif ($by ==
"completed")
594 $arSqlOrder[] =
" A.COMPLETED ".$order.
" ";
595 elseif ($by ==
"questions")
596 $arSqlOrder[] =
" A.QUESTIONS ".$order.
" ";
597 elseif ($by ==
"user_name")
598 $arSqlOrder[] =
" USER_NAME ".$order.
" ";
599 elseif ($by ==
"test_name")
600 $arSqlOrder[] =
" TEST_NAME ".$order.
" ";
602 $arSqlOrder[] =
" SPEED ".$order.
" ";
603 elseif ($s = $obUserFieldsSql->GetOrder($by))
604 $arSqlOrder[$by] =
" ".$s.
" ".
$order.
" ";
606 $arSqlOrder[] =
" A.ID ".$order.
" ";
611 $arSqlOrderCnt =
count($arSqlOrder);
612 for (
$i=0;
$i<$arSqlOrderCnt;
$i++)
615 $strSqlOrder =
" ORDER BY ";
619 $strSqlOrder .= $arSqlOrder[
$i];
622 $strSql .= $strSqlOrder;
624 if ( ! empty($arNavParams) )
627 if (isset($arNavParams[
'NAV_PARAMS'][
'nPageTop']) && ($arNavParams[
'NAV_PARAMS'][
'nPageTop'] > 0))
628 $nTopCount = (int) $arNavParams[
'NAV_PARAMS'][
'nPageTop'];
629 else if (isset($arNavParams[
'nPageTop']))
630 $nTopCount = (int) $arNavParams[
'nPageTop'];
631 else if (isset($arNavParams[
'nTopCount']))
632 $nTopCount = (int) $arNavParams[
'nTopCount'];
635 $res_cnt =
$DB->Query(
"SELECT COUNT(A.ID) as C " . $strSqlFrom);
636 $res_cnt = $res_cnt->fetch();
637 $res =
new CDBResult();
638 $res->NavQuery($strSql, $res_cnt[
'C'], $arNavParams);
642 if ($nTopCount !==
null)
644 $strSql =
$DB->TopSql($strSql, $nTopCount);
659 private static function getSpeedFieldSql()
661 return "round((unix_timestamp(coalesce(A.DATE_END, A.DATE_START))-unix_timestamp(A.DATE_START)) / (case when A.QUESTIONS > 0 then A.QUESTIONS else 1 end))";
668 $ATTEMPT_ID = intval($ATTEMPT_ID);
671 if (!$arAttempt = $attempt->Fetch())
678 if (!$arTest = $test->Fetch())
684 $strSql =
"DELETE FROM b_learn_test_result WHERE ATTEMPT_ID = ".$ATTEMPT_ID;
685 if (!
$DB->Query($strSql))
710 if ($arTest[
"QUESTIONS_FROM"] ==
"C" || $arTest[
"QUESTIONS_FROM"] ==
"L")
712 $courseId = $arTest[
'COURSE_ID'] + 0;
714 if ($courseLessonId ===
false)
722 if ($arTest[
"QUESTIONS_FROM"] ==
"C")
725 "SELECT Q.ID as QUESTION_ID, TLEUP.SOURCE_NODE as FROM_ID
726 FROM b_learn_lesson L
727 INNER JOIN b_learn_question Q ON L.ID = Q.LESSON_ID
728 INNER JOIN b_learn_lesson_edges TLEUP ON L.ID = TLEUP.TARGET_NODE
729 LEFT OUTER JOIN b_learn_lesson_edges TLEDOWN ON L.ID = TLEDOWN.SOURCE_NODE "
730 .
"WHERE L.ID IN (" . $clauseAllChildsLessons .
") \n"
731 .
" AND TLEDOWN.SOURCE_NODE IS NULL \n"
734 .
" AND TLEUP.SOURCE_NODE IN (" . $clauseAllChildsLessons .
") \n"
736 .
" AND Q.ACTIVE = 'Y' "
737 . ($arTest[
"INCLUDE_SELF_TEST"] !=
"Y" ?
"AND Q.SELF = 'N' " :
"")
743 "SELECT Q.ID as QUESTION_ID, L.ID as FROM_ID ".
744 "FROM b_learn_lesson L ".
745 "INNER JOIN b_learn_question Q ON L.ID = Q.LESSON_ID ".
746 "WHERE L.ID IN (" . $clauseAllChildsLessons .
") AND Q.ACTIVE = 'Y' ".
747 ($arTest[
"INCLUDE_SELF_TEST"] !=
"Y" ?
"AND Q.SELF = 'N' " :
"").
751 if (!
$res =
$DB->Query($strSql))
756 while ($arRecord =
$res->Fetch())
760 if (
$tmp[$arRecord[
"FROM_ID"]] < $arTest[
"QUESTIONS_AMOUNT"])
761 $tmp[$arRecord[
"FROM_ID"]]++;
767 $tmp[$arRecord[
"FROM_ID"]] = 1;
769 $Values[]= $arRecord[
"QUESTION_ID"];
778 $DB->StartTransaction();
779 foreach ($Values as
$ID)
781 $strSql =
"INSERT INTO b_learn_test_result (ATTEMPT_ID, QUESTION_ID) VALUES (".$ATTEMPT_ID.
",".
$ID.
")";
782 if (!
$DB->Query($strSql))
790 elseif (($arTest[
"QUESTIONS_FROM"] ==
"H" || $arTest[
"QUESTIONS_FROM"] ==
"S" || $arTest[
"QUESTIONS_FROM"] ==
"R") && $arTest[
"QUESTIONS_FROM_ID"])
793 if ($arTest[
"QUESTIONS_FROM"] ==
"H")
805 elseif ($arTest[
"QUESTIONS_FROM"] ==
'R')
808 $WHERE =
" (L.ID IN(" . $clauseAllChildsLessons .
") OR (L.ID = " . ($arTest[
'QUESTIONS_FROM_ID'] + 0) .
")) ";
810 elseif ($arTest[
"QUESTIONS_FROM"] ==
'S')
812 $clauseAllChildsLessons = $arTest[
"QUESTIONS_FROM_ID"] + 0;
813 $WHERE =
" (L.ID IN(" . $clauseAllChildsLessons .
") OR (L.ID = " . ($arTest[
'QUESTIONS_FROM_ID'] + 0) .
")) ";
821 "SELECT Q.ID AS QUESTION_ID ".
822 "FROM b_learn_lesson L ".
823 "INNER JOIN b_learn_question Q ON L.ID = Q.LESSON_ID ".
824 "WHERE " . $WHERE .
" AND Q.ACTIVE = 'Y' ".
825 ($arTest[
"INCLUDE_SELF_TEST"] !=
"Y" ?
"AND Q.SELF = 'N' " :
"").
827 ($arTest[
"QUESTIONS_AMOUNT"] > 0 ?
"LIMIT ".$arTest[
"QUESTIONS_AMOUNT"] :
"");
830 $rsQuestions =
$DB->Query($strSql);
835 $arSqlSubstrings =
array();
836 while ($arQuestion = $rsQuestions->fetch())
837 $arSqlSubstrings[] =
"(" . $ATTEMPT_ID .
", " . $arQuestion[
'QUESTION_ID'] .
")";
839 if ( ! empty($arSqlSubstrings) )
840 $strSql =
"INSERT INTO b_learn_test_result (ATTEMPT_ID, QUESTION_ID) VALUES " . implode(
",\n", $arSqlSubstrings);
844 $rc =
$DB->Query($strSql);
845 if ($rc && intval($rc->AffectedRowsCount()) > 0)
856 elseif ($arTest[
"QUESTIONS_FROM"] ==
'A')
858 $courseId = $arTest[
'COURSE_ID'] + 0;
860 if ($courseLessonId ===
false)
869 "SELECT Q.ID AS QUESTION_ID
870 FROM b_learn_lesson L
871 INNER JOIN b_learn_question Q ON L.ID = Q.LESSON_ID
872 WHERE (L.ID IN (" . $clauseAllChildsLessons .
") OR (L.ID = " . ($courseLessonId + 0) .
") )
874 . ($arTest[
"INCLUDE_SELF_TEST"] !=
"Y" ?
"AND Q.SELF = 'N' " :
"").
876 ($arTest[
"QUESTIONS_AMOUNT"] > 0 ?
"LIMIT " . ($arTest[
"QUESTIONS_AMOUNT"] + 0) :
"");
880 $rsQuestions =
$DB->Query($strSql);
885 $arSqlSubstrings =
array();
886 while ($arQuestion = $rsQuestions->fetch())
887 $arSqlSubstrings[] =
"(" . $ATTEMPT_ID .
", " . $arQuestion[
'QUESTION_ID'] .
")";
889 if ( ! empty($arSqlSubstrings) )
890 $strSql =
"INSERT INTO b_learn_test_result (ATTEMPT_ID, QUESTION_ID) VALUES " . implode(
",\n", $arSqlSubstrings);
894 $rc =
$DB->Query($strSql);
895 if ($rc && intval($rc->AffectedRowsCount()) > 0)
909 $strSql =
"UPDATE b_learn_attempt SET QUESTIONS = '".CTestResult::GetCount($ATTEMPT_ID).
"' WHERE ID = ".$ATTEMPT_ID;
static Certificate($STUDENT_ID, $COURSE_ID, $checkPerms=true)
static RecountAttempts($STUDENT_ID, $TEST_ID)
static CreateAttemptQuestions($ATTEMPT_ID)
CheckFields(&$arFields, $ID=false, $bCheckRights=true)
static IsTestCompleted($ATTEMPT_ID, $PERCENT)
static IsTestFailed($ATTEMPT_ID, $PERCENT)
AttemptFinished($ATTEMPT_ID)
static RecountQuestions($ATTEMPT_ID)
static GetCount($TEST_ID, $STUDENT_ID)
Update($ID, $arFields, $arParams=array())
static GetFilter($arFilter)
static OnAttemptChange($ATTEMPT_ID, $bCOMPLETED=false)
static GetList($arOrder=array(), $arFilter=array(), $arSelect=array(), $arNavParams=array())
static CourseGetLinkedLesson($courseId)
static FilterCreate($fname, $vals, $type, &$bFullJoin, $cOperationType=false, $bSkipEmpty=true)
static SQLClauseForAllSubLessons($parentLessonId)
static MkOperationFilter($key)
static DoInsert($arInsert, $arFields)
SetEntity($entity_id, $ID)
if(!is_array($prop["VALUES"])) $tmp
</td ></tr ></table ></td ></tr >< tr >< td class="bx-popup-label bx-width30"><?=GetMessage("PAGE_NEW_TAGS")?> array( $site)
global $USER_FIELD_MANAGER
ExecuteModuleEventEx($arEvent, $arParams=[])
DelDuplicateSort(&$arSort)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
GetMessage($name, $aReplace=null)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key
</p ></td >< td valign=top style='border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0cm 2.0pt 0cm 2.0pt;height:9.0pt'>< p class=Normal align=center style='margin:0cm;margin-bottom:.0001pt;text-align:center;line-height:normal'>< a name=ТекстовоеПоле54 ></a ><?=($taxRate > count( $arTaxList) > 0) ? $taxRate."%"