You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							231 lines
						
					
					
						
							5.8 KiB
						
					
					
				
			
		
		
	
	
							231 lines
						
					
					
						
							5.8 KiB
						
					
					
				<?php
 | 
						|
/* For licensing terms, see /license.txt */
 | 
						|
 | 
						|
/**
 | 
						|
 * GamificationUtils class
 | 
						|
 * Functions to manage the gamification mode.
 | 
						|
 *
 | 
						|
 * @author Angel Fernando Quiroz Campos <angel.quiroz@beeznest.com>
 | 
						|
 */
 | 
						|
class GamificationUtils
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * Get the calculated points on session with gamification mode.
 | 
						|
     *
 | 
						|
     * @param int $userId     The user ID
 | 
						|
     * @param int $userStatus The user Status
 | 
						|
     *
 | 
						|
     * @return float
 | 
						|
     */
 | 
						|
    public static function getTotalUserPoints($userId, $userStatus)
 | 
						|
    {
 | 
						|
        $points = 0;
 | 
						|
 | 
						|
        $sessions = SessionManager::getSessionsFollowedByUser(
 | 
						|
            $userId,
 | 
						|
            $userStatus
 | 
						|
        );
 | 
						|
 | 
						|
        if (empty($sessions)) {
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($sessions as $session) {
 | 
						|
            $points += self::getSessionPoints($session['id'], $userId);
 | 
						|
        }
 | 
						|
 | 
						|
        return round($points / count($sessions), 2);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the achieved points for an user in a session.
 | 
						|
     *
 | 
						|
     * @param int $sessionId The session ID
 | 
						|
     * @param int $userId    The user ID
 | 
						|
     *
 | 
						|
     * @return int The count of points
 | 
						|
     */
 | 
						|
    public static function getSessionPoints($sessionId, $userId)
 | 
						|
    {
 | 
						|
        $totalPoints = 0;
 | 
						|
        $courses = SessionManager::get_course_list_by_session_id($sessionId);
 | 
						|
 | 
						|
        if (empty($courses)) {
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($courses as $course) {
 | 
						|
            $learnPathListObject = new LearnpathList(
 | 
						|
                $userId,
 | 
						|
                api_get_course_info($course['code']),
 | 
						|
                $sessionId
 | 
						|
            );
 | 
						|
            $learnPaths = $learnPathListObject->get_flat_list();
 | 
						|
 | 
						|
            if (empty($learnPaths)) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
 | 
						|
            $score = 0;
 | 
						|
 | 
						|
            foreach ($learnPaths as $learnPathId => $learnPathInfo) {
 | 
						|
                if (empty($learnPathInfo['seriousgame_mode'])) {
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                $learnPath = new learnpath(
 | 
						|
                    $course['code'],
 | 
						|
                    $learnPathId,
 | 
						|
                    $userId
 | 
						|
                );
 | 
						|
                $score += $learnPath->getCalculateScore($sessionId);
 | 
						|
            }
 | 
						|
            $totalPoints += round($score / count($learnPaths), 2);
 | 
						|
        }
 | 
						|
 | 
						|
        return round($totalPoints / count($courses), 2);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the calculated progress for an user in a session.
 | 
						|
     *
 | 
						|
     * @param int $sessionId The session ID
 | 
						|
     * @param int $userId    The user ID
 | 
						|
     *
 | 
						|
     * @return float The progress
 | 
						|
     */
 | 
						|
    public static function getSessionProgress($sessionId, $userId)
 | 
						|
    {
 | 
						|
        $courses = SessionManager::get_course_list_by_session_id($sessionId);
 | 
						|
        $progress = 0;
 | 
						|
 | 
						|
        if (empty($courses)) {
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($courses as $course) {
 | 
						|
            $courseProgress = Tracking::get_avg_student_progress(
 | 
						|
                $userId,
 | 
						|
                $course['code'],
 | 
						|
                [],
 | 
						|
                $sessionId,
 | 
						|
                false,
 | 
						|
                true
 | 
						|
            );
 | 
						|
 | 
						|
            if (false === $courseProgress) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
 | 
						|
            $progress += $courseProgress;
 | 
						|
        }
 | 
						|
 | 
						|
        return round($progress / count($courses), 2);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the number of stars achieved for an user in a session.
 | 
						|
     *
 | 
						|
     * @param int $sessionId The session ID
 | 
						|
     * @param int $userId    The user ID
 | 
						|
     *
 | 
						|
     * @return int The number of stars
 | 
						|
     */
 | 
						|
    public static function getSessionStars($sessionId, $userId)
 | 
						|
    {
 | 
						|
        $totalStars = 0;
 | 
						|
        $courses = SessionManager::get_course_list_by_session_id($sessionId);
 | 
						|
 | 
						|
        if (empty($courses)) {
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($courses as $course) {
 | 
						|
            $learnPathListObject = new LearnpathList(
 | 
						|
                $userId,
 | 
						|
                api_get_course_info($course['code']),
 | 
						|
                $sessionId
 | 
						|
            );
 | 
						|
            $learnPaths = $learnPathListObject->get_flat_list();
 | 
						|
 | 
						|
            if (empty($learnPaths)) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
 | 
						|
            $stars = 0;
 | 
						|
 | 
						|
            foreach ($learnPaths as $learnPathId => $learnPathInfo) {
 | 
						|
                if (empty($learnPathInfo['seriousgame_mode'])) {
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                $learnPath = new learnpath(
 | 
						|
                    $course['code'],
 | 
						|
                    $learnPathId,
 | 
						|
                    $userId
 | 
						|
                );
 | 
						|
 | 
						|
                $stars += $learnPath->getCalculateStars($sessionId);
 | 
						|
            }
 | 
						|
 | 
						|
            $totalStars += round($stars / count($learnPaths));
 | 
						|
        }
 | 
						|
 | 
						|
        return round($totalStars / count($courses));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the stars on sessions with gamification mode.
 | 
						|
     *
 | 
						|
     * @param int $userId     The user ID
 | 
						|
     * @param int $userStatus The user Status
 | 
						|
     *
 | 
						|
     * @return int
 | 
						|
     */
 | 
						|
    public static function getTotalUserStars($userId, $userStatus)
 | 
						|
    {
 | 
						|
        $stars = 0;
 | 
						|
        $sessions = SessionManager::getSessionsFollowedByUser(
 | 
						|
            $userId,
 | 
						|
            $userStatus
 | 
						|
        );
 | 
						|
 | 
						|
        if (empty($sessions)) {
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($sessions as $session) {
 | 
						|
            $stars += self::getSessionStars($session['id'], $userId);
 | 
						|
        }
 | 
						|
 | 
						|
        return round($stars / count($sessions));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get the total progress on sessions with gamification mode.
 | 
						|
     *
 | 
						|
     * @param int $userId     The user ID
 | 
						|
     * @param int $userStatus The user Status
 | 
						|
     *
 | 
						|
     * @return float
 | 
						|
     */
 | 
						|
    public static function getTotalUserProgress($userId, $userStatus)
 | 
						|
    {
 | 
						|
        $progress = 0;
 | 
						|
 | 
						|
        $sessions = SessionManager::getSessionsFollowedByUser(
 | 
						|
            $userId,
 | 
						|
            $userStatus
 | 
						|
        );
 | 
						|
 | 
						|
        if (empty($sessions)) {
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($sessions as $session) {
 | 
						|
            $progress += self::getSessionProgress($session['id'], $userId);
 | 
						|
        }
 | 
						|
 | 
						|
        return round($progress / count($sessions), 2);
 | 
						|
    }
 | 
						|
}
 | 
						|
 |