/**
 * Get a list of courses (code, url, title, teacher, language) and return to caller
 * Function registered as service. Returns strings in UTF-8.
 * @param string Security key (the Dokeos install's API key)
 * @param mixed  Array or string. Type of visibility of course (public, public-registered, private, closed)
 * @return array Courses list (code=>[title=>'title',url='http://...',teacher=>'...',language=>''],code=>[...],...)
 */
function courses_list($security_key, $visibilities = 'public')
{
    global $_configuration;
    // Check if this script is launch by server and if security key is ok.
    if ($security_key != $_configuration['security_key']) {
        return array('error_msg' => 'Security check failed');
    }
    $vis = array('public' => '3', 'public-registered' => '2', 'private' => '1', 'closed' => '0');
    $courses_list = array();
    if (!is_array($visibilities)) {
        $tmp = $visibilities;
        $visibilities = array($tmp);
    }
    foreach ($visibilities as $visibility) {
        if (!in_array($visibility, array_keys($vis))) {
            return array('error_msg' => 'Security check failed');
        }
        $courses_list_tmp = CourseManager::get_courses_list(null, null, null, null, $vis[$visibility]);
        foreach ($courses_list_tmp as $index => $course) {
            $course_info = CourseManager::get_course_information($course['code']);
            $courses_list[$course['code']] = array('title' => api_utf8_encode($course_info['title']), 'url' => api_get_path(WEB_COURSE_PATH) . $course_info['directory'] . '/', 'teacher' => api_utf8_encode($course_info['tutor_name']), 'language' => $course_info['course_language']);
        }
    }
    return $courses_list;
}
/**
 * Get a list of courses (code, url, title, teacher, language) and return to caller
 * Function registered as service. Returns strings in UTF-8.
 * @param string User name in Chamilo
 * @param string Signature (composed of the sha1(username+apikey)
 * @param mixed  Array or string. Type of visibility of course (public, public-registered, private, closed)
 * @return array Courses list (code=>[title=>'title',url='http://...',teacher=>'...',language=>''],code=>[...],...)
 */
function WSCourseList($username, $signature, $visibilities = 'public')
{
    if (empty($username) or empty($signature)) {
        return -1;
    }
    global $_configuration;
    $info = api_get_user_info_from_username($username);
    $user_id = $info['user_id'];
    if (!UserManager::is_admin($user_id)) {
        return -1;
    }
    $list = UserManager::get_api_keys($user_id, 'dokeos');
    $key = '';
    foreach ($list as $key) {
        break;
    }
    $local_key = $username . $key;
    if (!api_is_valid_secret_key($signature, $local_key) && !api_is_valid_secret_key($signature, $username . $_configuration['security_key'])) {
        return -1;
        // The secret key is incorrect.
    }
    //public-registered = open
    $vis = array('public' => '3', 'public-registered' => '2', 'private' => '1', 'closed' => '0');
    $courses_list = array();
    if (!is_array($visibilities)) {
        $visibilities = split(',', $visibilities);
    }
    foreach ($visibilities as $visibility) {
        if (!in_array($visibility, array_keys($vis))) {
            return array('error_msg' => 'Security check failed');
        }
        $courses_list_tmp = CourseManager::get_courses_list(null, null, null, null, $vis[$visibility]);
        foreach ($courses_list_tmp as $index => $course) {
            $course_info = CourseManager::get_course_information($course['code']);
            $courses_list[] = array('code' => $course['code'], 'title' => api_utf8_encode($course_info['title']), 'url' => api_get_path(WEB_COURSE_PATH) . $course_info['directory'] . '/', 'teacher' => api_utf8_encode($course_info['tutor_name']), 'language' => $course_info['course_language']);
        }
    }
    return $courses_list;
}
function WSListCourses($params)
{
    if (!WSHelperVerifyKey($params)) {
        return return_error(WS_ERROR_SECRET_KEY);
    }
    $course_field_name = isset($params['original_course_id_name']) ? $params['original_course_id_name'] : '';
    $courses_result = array();
    $category_names = array();
    $courses = CourseManager::get_courses_list();
    foreach ($courses as $course) {
        $course_tmp = array();
        $course_tmp['id'] = $course['id'];
        $course_tmp['code'] = $course['code'];
        $course_tmp['title'] = $course['title'];
        $course_tmp['language'] = $course['course_language'];
        $course_tmp['visibility'] = $course['visibility'];
        // Determining category name
        if (!empty($course['category_code']) && $category_names[$course['category_code']]) {
            $course_tmp['category_name'] = $category_names[$course['category_code']];
        } else {
            $category = CourseManager::get_course_category($course['category_code']);
            $category_names[$course['category_code']] = $category['name'];
            $course_tmp['category_name'] = $category['name'];
        }
        // Determining number of students registered in course
        $course_tmp['number_students'] = CourseManager::get_users_count_in_course($course['code']);
        // Determining external course id
        $externalCourseId = '';
        if ($course_field_name) {
            $externalCourseId = CourseManager::get_course_extra_field_value($course_field_name, $course['code']);
        }
        $course_tmp['external_course_id'] = $externalCourseId;
        $courses_result[] = $course_tmp;
    }
    return $courses_result;
}
    $global = true;
} else {
    $global = false;
}
$global = true;
$course_list = $course_select_list = array();
$course_select_list[0] = get_lang('None');
$htmlHeadXtra[] = '
<script type="text/javascript">
function load_courses() {
	document.search_simple.submit();
}
</script>	';
$session_id = intval($_REQUEST['session_id']);
if (empty($session_id)) {
    $temp_course_list = CourseManager::get_courses_list();
} else {
    $temp_course_list = SessionManager::get_course_list_by_session_id($session_id);
}
foreach ($temp_course_list as $temp_course_item) {
    $course_item = CourseManager::get_course_information($temp_course_item['code']);
    $course_list[] = array('db_name' => $course_item['db_name'], 'code' => $course_item['code'], 'title' => $course_item['title'], 'visual_code' => $course_item['visual_code']);
    $course_select_list[$temp_course_item['code']] = $course_item['title'];
}
//Get session list
$session_list = SessionManager::get_sessions_list(array(), array('name'));
$my_session_list = array();
$my_session_list[0] = get_lang('None');
foreach ($session_list as $sesion_item) {
    $my_session_list[$sesion_item['id']] = $sesion_item['name'];
}
function search($needle, $type)
{
    global $elements_in;
    $xajax_response = new xajaxResponse();
    $return = '';
    if (!empty($needle) && !empty($type)) {
        if ($type == 'single') {
        } else {
            $list = CourseManager::get_courses_list(0, 0, 2, 'ASC', -1, $needle);
        }
        if ($type == 'single') {
        } else {
            $return .= '<select id="elements_not_in" name="elements_not_in_name[]" multiple="multiple" size="15" style="width:360px;">';
            foreach ($list as $row) {
                if (!in_array($row['id'], array_keys($elements_in))) {
                    $return .= '<option value="' . $row['id'] . '">' . $row['title'] . ' (' . $row['visual_code'] . ')</option>';
                }
            }
            $return .= '</select>';
            $xajax_response->addAssign('ajax_list_multiple', 'innerHTML', api_utf8_encode($return));
        }
    }
    return $xajax_response;
}
function search($needle, $type)
{
    global $tbl_user, $elements_in;
    $xajax_response = new XajaxResponse();
    $return = '';
    if (!empty($needle) && !empty($type)) {
        // xajax send utf8 datas... datas in db can be non-utf8 datas
        $charset = api_get_system_encoding();
        $needle = Database::escape_string($needle);
        $needle = api_convert_encoding($needle, $charset, 'utf-8');
        if ($type == 'single') {
            // search users where username or firstname or lastname begins likes $needle
            /*  $sql = 'SELECT user.user_id, username, lastname, firstname FROM '.$tbl_user.' user
                    WHERE (username LIKE "'.$needle.'%"
                    OR firstname LIKE "'.$needle.'%"
                OR lastname LIKE "'.$needle.'%") AND user.user_id<>"'.$user_anonymous.'"   AND user.status<>'.DRH.''.
                $order_clause.
                ' LIMIT 11';*/
        } else {
            $list = CourseManager::get_courses_list(0, 0, 2, 'ASC', -1, $needle);
        }
        $i = 0;
        if ($type == 'single') {
            /*
                        while ($user = Database :: fetch_array($rs)) {
                            $i++;
                            if ($i<=10) {
                                $person_name = api_get_person_name($user['firstname'], $user['lastname']);
                                $return .= '<a href="javascript: void(0);" onclick="javascript: add_user_to_session(\''.$user['user_id'].'\',\''.$person_name.' ('.$user['username'].')'.'\')">'.$person_name.' ('.$user['username'].')</a><br />';
                            } else {
                                $return .= '...<br />';
                            }
                        }
                        $xajax_response -> addAssign('ajax_list_users_single','innerHTML',api_utf8_encode($return));*/
        } else {
            $return .= '<select id="elements_not_in" name="elements_not_in_name[]" multiple="multiple" size="15" style="width:360px;">';
            foreach ($list as $row) {
                if (!in_array($row['id'], array_keys($elements_in))) {
                    $return .= '<option value="' . $row['id'] . '">' . $row['title'] . ' (' . $row['visual_code'] . ')</option>';
                }
            }
            $return .= '</select>';
            $xajax_response->addAssign('ajax_list_multiple', 'innerHTML', api_utf8_encode($return));
        }
    }
    return $xajax_response;
}
             }
             echo json_encode($results);
         } else {
             echo json_encode(array());
         }
     }
     break;
 case 'search_course':
     if (api_is_platform_admin()) {
         if (!empty($_GET['session_id']) && intval($_GET['session_id'])) {
             //if session is defined, lets find only courses of this session
             $courseList = SessionManager::get_course_list_by_session_id($_GET['session_id'], $_GET['q']);
         } else {
             //if session is not defined lets search all courses STARTING with $_GET['q']
             //TODO change this function to search not only courses STARTING with $_GET['q']
             $courseList = CourseManager::get_courses_list(0, 0, 1, 'ASC', -1, $_GET['q'], null, true);
         }
         $results = array();
         require_once api_get_path(LIBRARY_PATH) . 'course_category.lib.php';
         if (!empty($courseList)) {
             foreach ($courseList as $courseInfo) {
                 $title = $courseInfo['title'];
                 if (!empty($courseInfo['category_code'])) {
                     $parents = getParentsToString($courseInfo['category_code']);
                     $title = $parents . $courseInfo['title'];
                 }
                 $results[] = array('id' => $courseInfo['id'], 'text' => $title);
             }
             echo json_encode($results);
         } else {
             echo json_encode(array());
     $tplPath = 'skill/student_boss_report.html.twig';
     $tpl->addGlobal('followedStudents', $followedStudents);
     $tpl->addGlobal('selectedStudent', $selectedStudent);
 } else {
     if ($isDRH) {
         $selectedCourse = isset($_REQUEST['course']) ? intval($_REQUEST['course']) : null;
         $selectedSkill = isset($_REQUEST['skill']) ? intval($_REQUEST['skill']) : 0;
         $action = null;
         if (!empty($selectedCourse)) {
             $action = 'filterByCourse';
         } else {
             if (!empty($selectedSkill)) {
                 $action = 'filterBySkill';
             }
         }
         $courses = CourseManager::get_courses_list();
         $tableRows = array();
         $reportTitle = null;
         $objSkill = new Skill();
         $skills = $objSkill->get_all();
         switch ($action) {
             case 'filterByCourse':
                 $course = api_get_course_info_by_id($selectedCourse);
                 $reportTitle = sprintf(get_lang('AchievedSkillInCourseX'), $course['name']);
                 $tableRows = $objSkill->listAchievedByCourse($selectedCourse);
                 break;
             case 'filterBySkill':
                 $skill = $objSkill->get($selectedSkill);
                 $reportTitle = sprintf(get_lang('StudentsWhoAchievedTheSkillX'), $skill['name']);
                 $students = UserManager::getUsersFollowedByUser($userId, STUDENT, false, false, false, null, null, null, null, null, null, DRH);
                 $coursesFilter = array();
<?php

/* For licensing terms, see /license.txt */
/**
 *  @package chamilo.admin
 */
// Language files that need to be included.
$language_file = array('admin');
$cidReset = true;
require_once '../inc/global.inc.php';
require_once api_get_path(SYS_CODE_PATH) . 'gradebook/lib/be.inc.php';
require_once api_get_path(SYS_CODE_PATH) . 'gradebook/lib/gradebook_functions.inc.php';
Display::display_header(null);
$form = new FormValidator('export_certificate');
$courses = CourseManager::get_courses_list(0, 0, 'title');
$options = array();
foreach ($courses as $course) {
    $options[$course['id']] = $course['title'];
}
$form->addElement('select', 'course', get_lang('Course'), $options);
$form->addElement('file', 'file', get_lang('File'));
$form->add_button('submit', get_lang('Submit'));
$form->display();
if ($form->validate()) {
    $values = $form->getSubmitValues();
    if (isset($_FILES['file']['tmp_name']) && !empty($_FILES['file']['tmp_name'])) {
        $users = Import::csv_reader($_FILES['file']['tmp_name']);
        $courseId = $values['course'];
        $courseInfo = api_get_course_info_by_id($courseId);
        $courseCode = $courseInfo['code'];
        $cats = Category::load(null, null, $courseCode, null, null, 0, false);
	/**
	 * List courses
	 *
	 * @param string API secret key
	 * @param string A list of visibility filter we want to apply
	 * @return array An array with elements of the form ('id' => 'Course internal id', 'code' => 'Course code', 'title' => 'Course title', 'language' => 'Course language', 'visibility' => 'Course visibility',
	 * 'category_name' => 'Name of the category of the course', 'number_students' => 'Number of students in the course', 'external_course_id' => 'External course id')
	 */
	public function ListCourses($secret_key, $visibility = 'public,public-registered,private,closed') {
		$verifKey = $this->verifyKey($secret_key);
		if($verifKey instanceof WSError) {
			$this->handleError($verifKey);
		} else {
            $visibilities = split(',',$visibility);
            $vis = array('public' => '3', 'public-registered' => '2', 'private' => '1', 'closed' => '0');
            foreach ($visibilities as $p => $visibility) {
                $visibilities[$p] = $vis[$visibility];
            }
			$courses_result = array();
			$category_names = array();

			$courses = CourseManager::get_courses_list();
			foreach($courses as $course) {
                //skip elements that do not match required visibility
                if (!in_array($course['visibility'],$visibilities)) { continue; }
				$course_tmp = array();
				$course_tmp['id'] = $course['id'];
				$course_tmp['code'] = $course['code'];
				$course_tmp['title'] = $course['title'];
				$course_tmp['language'] = $course['course_language'];
				$course_tmp['visibility'] = $course['visibility'];

				// Determining category name
				if($category_names[$course['category_code']]) {
					$course_tmp['category_name'] = $category_names[$course['category_code']];
				} else {
					$category = CourseManager::get_course_category($course['category_code']);
					$category_names[$course['category_code']] = $category['name'];
					$course_tmp['category_name'] = $category['name'];
				}

				// Determining number of students registered in course
				$user_list = CourseManager::get_user_list_from_course_code($course['code'], 0);
				$course_tmp['number_students'] = count($user_list);

				// Determining external course id - this code misses the external course id field name
				// $course_tmp['external_course_id'] = CourseManager::get_course_extra_field_value($course_field_name, $course['code']);


				$courses_result[] = $course_tmp;
			}

			return $courses_result;
		}
	}
	/**
	 * List courses
	 *
	 * @param string API secret key
	 * @param string Course id field name. Use "chamilo_course_id" to use internal id
	 * @return array An array with elements of the form ('id' => 'Course internal id', 'code' => 'Course code', 'title' => 'Course title', 'language' => 'Course language', 'visibility' => 'Course visibility',
	 * 'category_name' => 'Name of the category of the course', 'number_students' => 'Number of students in the course', 'external_course_id' => 'External course id')
	 */
	public function ListCourses($secret_key, $course_id_field_name) {
		$verifKey = $this->verifyKey($secret_key);
		if($verifKey instanceof WSError) {
			$this->handleError($verifKey);
		} else {
			$courses_result = array();
			$category_names = array();

			$courses = CourseManager::get_courses_list();
			foreach($courses as $course) {
				$course_tmp = array();
				$course_tmp['id'] = $course['id'];
				$course_tmp['code'] = $course['code'];
				$course_tmp['title'] = $course['title'];
				$course_tmp['language'] = $course['course_language'];
				$course_tmp['visibility'] = $course['visibility'];

				// Determining category name
				if($category_names[$course['category_code']]) {
					$course_tmp['category_name'] = $category_names[$course['category_code']];
				} else {
					$category = CourseManager::get_course_category($course['category_code']);
					$category_names[$course['category_code']] = $category['name'];
					$course_tmp['category_name'] = $category['name'];
				}

				// Determining number of students registered in course
				$user_list = CourseManager::get_user_list_from_course_code($course['code']);
				$course_tmp['number_students'] = count($user_list);

				// Determining external course id
				$course_tmp['external_course_id'] = CourseManager::get_course_extra_field_value($course_id_field_name, $course['code']);


				$courses_result[] = $course_tmp;
			}

			return $courses_result;
		}
	}
function reports_template_CourseArticulate_getSQL()
{
    // settings
    // Nom, prenom
    $query = 'select u.lastname as "Last name", u.firstname as "First name" ';
    $query .= 'from ' . Database::get_main_table(TABLE_MAIN_USER) . ' u ';
    $query .= ' where u.user_id in (' . reports_getVisibilitySQL() . ') ';
    $query .= ' order by u.user_id ';
    $queries[0] = $query;
    $extraFieldType = \Chamilo\CoreBundle\Entity\ExtraField::USER_FIELD_TYPE;
    // Custom Field
    foreach (array("tags" => "tags") as $k => $v) {
        // FIXME
        $query = 'select ufv.value  as "' . $v . '" ';
        $query .= 'from ' . Database::get_main_table(TABLE_MAIN_USER) . ' u ';
        $query .= 'left join' . Database::get_main_table(TABLE_EXTRA_FIELD) . ' uf ';
        $query .= ' on uf.variable ="' . $k . '" ';
        $query .= 'left outer join ' . Database::get_main_table(TABLE_EXTRA_FIELD_VALUES) . ' ufv ';
        $query .= ' on ufv.item_id = u.user_id and ufv.field_id = uf.id ';
        $query .= 'where ufv.extra_field_type = ' . $extraFieldType . ' AND u.user_id in (' . reports_getVisibilitySQL() . ') ';
        $query .= ' order by u.user_id ';
        $queries[] = $query;
    }
    // Stored Value
    $sv = array();
    foreach ($sv as $k => $v) {
        if (!isset($v['sql'])) {
            $v['sql'] = 'FIELD';
        }
        $sqlField = str_replace('FIELD', 'sv.sv_value', $v['sql']);
        $query = 'select ' . $sqlField . ' as "' . $v['title'] . '" ';
        //		$query = 'select sec_to_time(sv.sv_value) as "'.$v.'" ';
        $query .= 'from ' . Database::get_main_table(TABLE_MAIN_USER) . ' u ';
        $query .= ' left outer join ' . Database::get_main_table(TABLE_TRACK_STORED_VALUES) . ' sv ';
        $query .= 'on sv.user_id = u.user_id and sv_key = "' . $k . '" ';
        $query .= ' where u.user_id in (' . reports_getVisibilitySQL() . ') ';
        $query .= ' group by u.user_id ';
        $query .= ' order by u.user_id ';
        $queries[] = $query;
    }
    // first and last connection
    $query = 'select min(tel.login_date) as "First connection", max(tel.logout_date) as "Latest connection"  ';
    $query .= 'from ' . Database::get_main_table(TABLE_MAIN_USER) . ' u ';
    $query .= 'left outer join ' . Database::get_main_table(TABLE_STATISTIC_TRACK_E_LOGIN) . ' tel ';
    $query .= ' on tel.login_user_id = u.user_id ';
    $query .= ' where u.user_id in (' . reports_getVisibilitySQL() . ') ';
    $query .= ' group by u.user_id ';
    $query .= ' order by u.user_id ';
    $queries[] = $query;
    // SCORM Data
    $scormData = array();
    $course_list = CourseManager::get_courses_list();
    foreach ($course_list as $code => $details) {
        $courseId = $details['id'];
        $list = Database::query('SELECT l.id as lid, l.name as lname, li.id as liid, li.title as lititle ' . ' FROM ' . Database::get_course_table(TABLE_LP_MAIN) . ' l, ' . Database::get_course_table(TABLE_LP_ITEM) . ' li ' . ' WHERE l.c_id = ' . $courseId . ' AND li.c_id = ' . $courseId . ' AND l.id = li.lp_id');
        while ($lpItem = Database::fetch_assoc($list)) {
            $scormData[] = array('lid' => $lpItem['lid'], 'liid' => $lpItem['liid'], 'target_view_count' => 1, 'target_indicator' => 'score', 'title' => $details['title'] . '/' . $lpItem['lname'] . '/' . $lpItem['lititle'] . '/1/score', 'sql' => 'FIELD');
            $scormData[] = array('lid' => $lpItem['lid'], 'liid' => $lpItem['liid'], 'target_view_count' => 2, 'target_indicator' => 'score', 'title' => $details['title'] . '/' . $lpItem['lname'] . '/' . $lpItem['lititle'] . '/2/score', 'sql' => 'FIELD');
            $scormData[] = array('lid' => $lpItem['lid'], 'liid' => $lpItem['liid'], 'target_view_count' => null, 'target_indicator' => 'score', 'title' => $details['title'] . '/' . $lpItem['lname'] . '/' . $lpItem['lititle'] . '/all/score', 'sql' => 'avg(FIELD)');
        }
    }
    foreach ($scormData as $v) {
        if (!isset($v['sql'])) {
            $v['sql'] = 'FIELD';
        }
        $sqlField = str_replace('FIELD', $v['target_indicator'], $v['sql']);
        $query = 'select ' . $sqlField . ' as "' . $v['title'] . '" ';
        $query .= 'from ' . Database::get_main_table(TABLE_MAIN_USER) . ' u ';
        $query .= 'left outer join ' . Database::get_course_table(TABLE_LP_VIEW) . ' lv ';
        $query .= ' on u.user_id = lv.user_id and lv.lp_id = ' . $v['lid'];
        $query .= ' left outer join ' . Database::get_course_table(TABLE_LP_ITEM_VIEW) . ' liv ';
        $query .= ' on lv.id = liv.lp_view_id ';
        if ($v['target_view_count']) {
            $query .= ' and liv.view_count = ' . $v['target_view_count'];
        }
        $query .= ' and liv.lp_item_id = ' . $v['liid'] . ' ';
        $query .= ' where u.user_id in (' . reports_getVisibilitySQL() . ') ';
        $query .= ' group by u.user_id ';
        $query .= ' order by u.user_id ';
        $queries[] = $query;
    }
    return $queries;
}