@ -2,6 +2,7 @@ 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					/* See license terms in /license.txt */  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					//use Chamilo\UserBundle\Entity\User;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					use Chamilo\CoreBundle\Component\Utils\ChamiloApi;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					/**  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					 * Class Event  
				
			 
			
		
	
	
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
				
				 
				 
				
					@ -1731,24 +1732,19 @@ class Event 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    /**  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * User logs in for the first time to a course  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param int $courseId  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param int $user_id  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param int $session_id  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param string $virtualTime - Minor modification to add a virtual time in hh:mm:ss to the logout datetime - see BT#12212  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * Registers in track_e_course_access when user logs in for the first time to a course  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param int $courseId ID of the course  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param int $user_id ID of the user  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param int $session_id ID of the session (if any)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     */  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    public static function event_course_login($courseId, $user_id, $session_id, $virtualTime = '' )  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    public static function event_course_login($courseId, $user_id, $session_id)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $course_tracking_table = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $loginDate = $logoutDate = api_get_utc_datetime();  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        //$counter represents the number of time this record has been refreshed  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $counter = 1;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if (!empty($virtualTime)) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $logoutDate = api_add_sub_hours_to_date_time(api_get_utc_datetime(), $virtualTime, true);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $counter = 0;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $courseId = intval($courseId);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $user_id = intval($user_id);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $session_id = intval($session_id);  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -1762,7 +1758,23 @@ class Event 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        CourseManager::update_course_ranking(null, null, null, null, true, false);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    public static function eventCourseVirtualLogin($courseId, $userId, $sessionId, $virtualTime = '')  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    /**  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * Register a "fake" time spent on the platform, for example to match the  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * estimated time he took to author an assignment/work, see configuration  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * setting considered_working_time.  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * This assumes there is already some connection of the student to the  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * course, otherwise he wouldn't be able to upload an assignment.  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * This works by creating a new record, copy of the current one, then  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * updating the current one to be just the considered_working_time and  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * end at the same second as the user connected to the course.  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param int $courseId The course in which to add the time  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param int $userId The user for whom to add the time  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param $sessionId The session in which to add the time (if any)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param string $virtualTime The amount of time to be added, in a hh:mm:ss format. If int, we consider it is expressed in hours.  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @param string $ip IP address to go on record for this time record  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     * @return True on successful insertion, false otherwise  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					     */  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    public static function eventCourseVirtualLogin($courseId, $userId, $sessionId, $virtualTime = '', $ip = '')  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $courseTrackingTable = Database::get_main_table(TABLE_STATISTIC_TRACK_E_COURSE_ACCESS);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $time = $loginDate = $logoutDate = api_get_utc_datetime();  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -1770,8 +1782,10 @@ class Event 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $courseId = intval($courseId);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $userId = intval($userId);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $sessionId = intval($sessionId);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $ip = api_get_real_ip( );  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $ip = Database::escape_string($ip );  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // Get the current latest course connection register. We need that  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // record to re-use the data and create a new record.  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $sql = "SELECT *  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        FROM $courseTrackingTable  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        WHERE  
				
			 
			
		
	
	
		
			
				
					
						
						
						
							
								 
							 
						
					 
				
				 
				 
				
					@ -1782,27 +1796,56 @@ class Event 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        ORDER BY login_course_date DESC LIMIT 0,1";  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        $result = Database::query($sql);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // Ignore if we didn't find any course connection record in the last  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        // hour. In this case it wouldn't be right to add a "fake" time record.  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        if (Database::num_rows($result) > 0) {  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // Found the latest connection  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $row = Database::fetch_row($result);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $courseAccessId = $row[0];  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $courseAccessLoginDate = $row[3];  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $courseAccessLogoutDate = $row[4];  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $counter = $row[5];  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $counter = $counter ? $counter : 0;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $sql = "INSERT INTO $courseTrackingTable(c_id, user_ip, user_id, login_course_date, logout_course_date, counter, session_id)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                VALUES('".$courseId."', '".$ip."', '".$userId."', '$courseAccessLoginDate', '$logoutDate', $counter, '".$sessionId."')";  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // Insert a new record, copy of the current one (except the logout  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // date that we update to the current time)  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $sql = "INSERT INTO $courseTrackingTable(  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    c_id,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    user_ip,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    user_id,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    login_course_date,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    logout_course_date,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    counter,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    session_id  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                ) VALUES(  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    $courseId,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    '$ip',   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    $userId,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    '$courseAccessLoginDate',   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    '$logoutDate',   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    $counter,   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                    $sessionId  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                )";  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            Database::query($sql);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $loginDate = api_add_sub_hours_to_date_time($courseAccessLoginDate, $virtualTime, false);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $loginDate = ChamiloApi::addOrSubTimeToDateTime(  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                $virtualTime,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                $courseAccessLoginDate,  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                false  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            );  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            // We update the course tracking table  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $sql = "UPDATE $courseTrackingTable    
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                            SET login_course_date = '$loginDate', logout_course_date = '$courseAccessLoginDate', counter = 0  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                            WHERE   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                                course_access_id = ".intval($courseAccessId)." AND   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                                session_id = ".$sessionId;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            Database::query($sql);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        SET   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                            login_course_date = '$loginDate',  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                            logout_course_date = '$courseAccessLoginDate',  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                            counter = 0  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                        WHERE   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                            course_access_id = ".intval($courseAccessId)." AND   
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					                            session_id = ".$sessionId;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            $result = Database::query($sql);  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					            return $result;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					        return false;  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    }  
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					
 
				
			 
			
		
	
		
			
				
					 
					 
				
				 
				 
				
					    /**