Your IP : 18.188.125.151


Current Path : /home/bitrix/ext_www/coffe.land/bitrix/modules/learning/classes/general/
Upload File :
Current File : /home/bitrix/ext_www/coffe.land/bitrix/modules/learning/classes/general/certification.php

<?

// 2012-04-10 Checked/modified for compatibility with new data model
class CAllCertification
{
	public static function LessonIdByCertId ($certId)
	{
		$rc = CCertification::GetByID($certId);
		if ($rc === false)
			throw new LearnException('', LearnException::EXC_ERR_ALL_GIVEUP);

		$row = $rc->Fetch();

		if ( ! isset($row['COURSE_ID']) )
			throw new LearnException('', LearnException::EXC_ERR_ALL_GIVEUP);

		$lessonId = CCourse::CourseGetLinkedLesson($row['COURSE_ID']);

		if ($lessonId === false)
			throw new LearnException('', LearnException::EXC_ERR_ALL_GIVEUP);

		return ($lessonId);
	}


	// 2012-04-10 Checked/modified for compatibility with new data model
	function CheckFields(&$arFields, $ID = false)
	{
		global $DB, $APPLICATION;

		if ($ID===false && !is_set($arFields, "STUDENT_ID"))
		{
			$APPLICATION->ThrowException(GetMessage("LEARNING_BAD_USER_ID"), "EMPTY_STUDENT_ID");
			return false;
		}
		elseif (is_set($arFields, "STUDENT_ID"))
		{
			$dbResult = CUser::GetByID($arFields["STUDENT_ID"]);
			if (!$dbResult->Fetch())
			{
				$APPLICATION->ThrowException(GetMessage("LEARNING_BAD_USER_ID_EX"), "ERROR_NO_STUDENT_ID");
				return false;
			}
		}

		if ($ID===false && !is_set($arFields, "COURSE_ID"))
		{
			$APPLICATION->ThrowException(GetMessage("LEARNING_BAD_COURSE_ID"), "ERROR_EMPTY_COURSE_ID");
			return false;
		}
		elseif (is_set($arFields, "COURSE_ID"))
		{
			if ($bCheckRights)
				$r = CCourse::GetByID($arFields["COURSE_ID"]);
			else
				$r = CCourse::GetList(Array(),Array("ID" => $arFields["COURSE_ID"], 'CHECK_PERMISSIONS' => 'N'));

			if(!$r->Fetch())
			{
				$APPLICATION->ThrowException(GetMessage("LEARNING_BAD_COURSE_ID_EX"), "ERROR_NO_COURSE_ID");
				return false;
			}
		}

		if (is_set($arFields, "STUDENT_ID") && is_set($arFields, "COURSE_ID"))
		{
			$res = CCertification::GetList(Array(), Array("STUDENT_ID" => $arFields["STUDENT_ID"], "COURSE_ID" => $arFields["COURSE_ID"]));
			if ($res->Fetch())
			{
				$APPLICATION->ThrowException(GetMessage("LEARNING_BAD_CERTIFICATE_DUPLICATE"), "ERROR_CERTIFICATE_DUPLICATE");
				return false;
			}
		}

		if (is_set($arFields, "DATE_CREATE") && (!$DB->IsDate($arFields["DATE_CREATE"], false, LANG, "FULL")))
		{
			$APPLICATION->ThrowException(GetMessage("LEARNING_BAD_DATE_CREATE"), "EMPTY_DATE_CREATE");
			return false;
		}

		if (is_set($arFields, "PUBLIC_PROFILE") && $arFields["PUBLIC"] != "N")
			$arFields["PUBLIC_PROFILE"] = "Y";

		if (is_set($arFields, "ACTIVE") && $arFields["ACTIVE"] != "N")
			$arFields["ACTIVE"] = "Y";

		if (is_set($arFields, "FROM_ONLINE") && $arFields["FROM_ONLINE"] != "N")
			$arFields["FROM_ONLINE"] = "Y";

		return true;
	}


	// 2012-04-10 Checked/modified for compatibility with new data model
	function Add($arFields, $arParams = array())
	{
		global $DB;

		$bCheckRights = true;
		if (isset($arParams['CHECK_PERMISSIONS']) && ($arParams['CHECK_PERMISSIONS'] === 'N'))
			$bCheckRights = false;

		if(CCertification::CheckFields($arFields, false, $bCheckRights))
		{
			unset($arFields["ID"]);

			CLearnHelper::FireEvent('OnBeforeCertificateAdd', $arFields);

			$ID = $DB->Add("b_learn_certification", $arFields, Array(), "learning");

			$arFields['ID'] = $ID;
			CLearnHelper::FireEvent('OnAfterCertificateAdd', $arFields);

			return $ID;
		}

		return false;
	}


	// 2012-04-10 Checked/modified for compatibility with new data model
	function Update($ID, $arFields, $arParams = array())
	{
		global $DB;

		$ID = intval($ID);
		if ($ID < 1) return false;

		$bCheckRights = true;
		if (isset($arParams['CHECK_PERMISSIONS']) && ($arParams['CHECK_PERMISSIONS'] === 'N'))
			$bCheckRights = false;

		if (CCertification::CheckFields($arFields, $ID, $bCheckRights))
		{
			unset($arFields["ID"]);
			unset($arFields["STUDENT_ID"]);
			unset($arFields["COURSE_ID"]);

			$arBinds=Array(
				//""=>$arFields[""]
			);

			CLearnHelper::FireEvent('OnBeforeCertificateUpdate', $arFields);

			$strUpdate = $DB->PrepareUpdate("b_learn_certification", $arFields, "learning");
			$strSql = "UPDATE b_learn_certification SET ".$strUpdate." WHERE ID=".$ID;
			$DB->QueryBind($strSql, $arBinds, false, "File: ".__FILE__."<br>Line: ".__LINE__);

			CLearnHelper::FireEvent('OnAfterCertificateUpdate', $arFields);

			return true;
		}

		return false;
	}


	// 2012-04-10 Checked/modified for compatibility with new data model
	function Delete($ID)
	{
		global $DB;

		$ID = intval($ID);
		if ($ID < 1) return false;

		CLearnHelper::FireEvent('OnBeforeCertificateDelete', $ID);

		$strSql = "SELECT G.ID FROM b_learn_certification C
					INNER JOIN b_learn_test T ON C.COURSE_ID = T.COURSE_ID
					INNER JOIN b_learn_gradebook G ON (G.TEST_ID = T.ID AND G.STUDENT_ID = C.STUDENT_ID)
					WHERE C.ID = ".$ID;

		$res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);

		//Gradebook
		while($arRecord = $res->Fetch())
		{
			if(!CGradeBook::Delete($arRecord["ID"]))
				return false;
		}

		$strSql = "DELETE FROM b_learn_certification WHERE ID = ".$ID;

		if (!$DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__))
			return false;

		CLearnHelper::FireEvent('OnAfterCertificateDelete', $ID);

		return true;
	}

	// 2012-04-10 Checked/modified for compatibility with new data model
	function GetFilter($arFilter)
	{

		if (!is_array($arFilter))
			$arFilter = Array();

		$arSqlSearch = Array();

		foreach ($arFilter as $key => $val)
		{
			$res = CLearnHelper::MkOperationFilter($key);
			$key = $res["FIELD"];
			$cOperationType = $res["OPERATION"];

			$key = strtoupper($key);

			switch ($key)
			{
				case "ID":
				case "STUDENT_ID":
				case "COURSE_ID":
				case "SORT":
				case "SUMMARY":
				case "MAX_SUMMARY":
					$arSqlSearch[] = CLearnHelper::FilterCreate("CER.".$key, $val, "number", $bFullJoin, $cOperationType);
					break;

				case "ACTIVE":
				case "PUBLIC_PROFILE":
				case "FROM_ONLINE":
					$arSqlSearch[] = CLearnHelper::FilterCreate("CER.".$key, $val, "string_equal", $bFullJoin, $cOperationType);
					break;

				case "TIMESTAMP_X":
				case "DATE_CREATE":
					$arSqlSearch[] = CLearnHelper::FilterCreate("CER.".$key, $val, "date", $bFullJoin, $cOperationType);
					break;

				case "USER":
					$arSqlSearch[] = GetFilterQuery("U.ID, U.LOGIN, U.NAME, U.LAST_NAME",$val);
					break;

			}

		}

		return $arSqlSearch;

	}

	// 2012-04-10 Checked/modified for compatibility with new data model
	function GetByID($ID)
	{
		return CCertification::GetList(Array(),Array("ID" => $ID));
	}


	// 2012-04-10 Checked/modified for compatibility with new data model
	public static function IsCourseCompleted($STUDENT_ID, $COURSE_ID)
	{
		global $DB;

		$STUDENT_ID = intval($STUDENT_ID);
		$COURSE_ID = intval($COURSE_ID);

		if ($STUDENT_ID < 1 || $COURSE_ID < 1)
			return false;

		$strSql = "
		SELECT COUNT(*) CNT_ALL, SUM(CASE WHEN G.COMPLETED = 'Y' THEN 1 ELSE 0 END ) CNT_COMPLETED
		FROM b_learn_test T
		INNER JOIN b_learn_course C ON T.COURSE_ID = C.ID
		INNER JOIN b_learn_lesson TUL ON C.LINKED_LESSON_ID = TUL.ID
		LEFT JOIN b_learn_gradebook G ON T.ID = G.TEST_ID AND G.STUDENT_ID = '".$STUDENT_ID."'
		WHERE T.COURSE_ID = '".$COURSE_ID."' AND TUL.ACTIVE = 'Y' AND T.ACTIVE = 'Y'
		";

		$res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);

		$cntAll = $cntCompleted = null;

		$isCourseCompleted = false;	// can be overrided below
		if ( ($ar = $res->Fetch()) && intval($ar["CNT_ALL"]) > 0)
		{
			$cntAll       = $ar['CNT_ALL'];
			$cntCompleted = $ar['CNT_COMPLETED'];

			if ($cntCompleted == $cntAll)
				$isCourseCompleted = true;
		}

		$arEventData = array(
			'STUDENT_ID'    => $STUDENT_ID,
			'COURSE_ID'     => $COURSE_ID,
			'CNT_ALL'       => $cntAll,
			'CNT_COMPLETED' => $cntCompleted
		);

		foreach(GetModuleEvents('learning', 'OnCheckCourseCompleted', true) as $arEvent)
		{
			$rc = ExecuteModuleEventEx($arEvent, array($arEventData));

			if ($rc === false)
			{
				$isCourseCompleted = false;
				break;
			}
			elseif ($rc === true)
			{
				$isCourseCompleted = true;
				break;
			}
		}

		return $isCourseCompleted;
	}


	// 2012-04-10 Checked/modified for compatibility with new data model
	function Certificate($STUDENT_ID, $COURSE_ID, $checkPerms = true)
	{
		global $DB;

		$STUDENT_ID = intval($STUDENT_ID);
		$COURSE_ID = intval($COURSE_ID);

		if ($STUDENT_ID < 1 || $COURSE_ID < 1)
			return false;

		if (CCertification::IsCourseCompleted($STUDENT_ID, $COURSE_ID))
		{

			$strSql = "SELECT SUM(G.RESULT) CNT, SUM(G.MAX_RESULT) MAX_CNT FROM b_learn_gradebook G
			INNER JOIN b_learn_test T ON T.ID = G.TEST_ID
			WHERE G.COMPLETED = 'Y' AND G.STUDENT_ID = '".$STUDENT_ID."' AND T.COURSE_ID = '".$COURSE_ID."'";
			$res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);

			$SUMMARY = $MAX_SUMMARY = 0;

			if ($ar = $res->Fetch())
			{
				$SUMMARY = $ar["CNT"];
				$MAX_SUMMARY = $ar["MAX_CNT"];
			}

			$arFields = array(
				'STUDENT_ID'  => $STUDENT_ID,
				'COURSE_ID'   => $COURSE_ID,
				'SUMMARY'     => &$SUMMARY,
				'MAX_SUMMARY' => &$MAX_SUMMARY 
			);

			foreach(GetModuleEvents('learning', 'OnBeforeCertificate', true) as $arEvent)
			{
				if (ExecuteModuleEventEx($arEvent, array(&$arFields))===false)
					return (false);
			}

			$arParams = array();

			if ( ! $checkPerms )
				$arParams['CHECK_PERMISSIONS'] = 'N';

			$strSql = "SELECT ID FROM b_learn_certification WHERE STUDENT_ID = '".$STUDENT_ID."' AND COURSE_ID = '".$COURSE_ID."'";
			$res = $DB->Query($strSql, false, "File: ".__FILE__."<br>Line: ".__LINE__);
			if ($ar = $res->Fetch())
			{
				return CCertification::Update($ar["ID"], Array("SUMMARY" => $SUMMARY, "MAX_SUMMARY" => $MAX_SUMMARY, "ACTIVE" => "Y"), $arParams);
			}
			else
			{
				$arFields = Array(
					"STUDENT_ID" => $STUDENT_ID,
					"COURSE_ID" => $COURSE_ID,
					"SUMMARY" => $SUMMARY,
					"MAX_SUMMARY" => $MAX_SUMMARY,
					"~DATE_CREATE" => CDatabase::CurrentTimeFunction(),
				);

				$ID = CCertification::Add($arFields, $arParams);
				return ($ID > 0);
			}
		}
		return false;
	}
}