/**
  * Unsubscribe course from a session
  *
  * @param int Session id
  * @param int Course id
  * @return bool True in case of success, false otherwise
  */
 public static function unsubscribe_course_from_session($session_id, $course_id)
 {
     $session_id = (int) $session_id;
     $course_id = (int) $course_id;
     $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
     $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
     $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
     // Get course code
     $course_code = CourseManager::get_course_code_from_course_id($course_id);
     $course_id = intval($course_id);
     if (empty($course_code)) {
         return false;
     }
     // Unsubscribe course
     $sql = "DELETE FROM {$tbl_session_rel_course}\n                WHERE c_id = {$course_id} AND session_id = {$session_id}";
     $result = Database::query($sql);
     $nb_affected = Database::affected_rows($result);
     $sql = "DELETE FROM {$tbl_session_rel_course_rel_user}\n                WHERE c_id = {$course_id} AND session_id = {$session_id}";
     Database::query($sql);
     Event::addEvent(LOG_SESSION_DELETE_COURSE, LOG_COURSE_ID, $course_id, api_get_utc_datetime(), api_get_user_id(), $course_id, $session_id);
     if ($nb_affected > 0) {
         // Update number of courses in the session
         $sql = "UPDATE {$tbl_session} SET nbr_courses= nbr_courses - {$nb_affected}\n                    WHERE id = {$session_id}";
         Database::query($sql);
         return true;
     } else {
         return false;
     }
 }
 /**
  * Gets the real course id based on the course id field name and value. Note that if the course id field name is "chamilo_course_id", it will use the course id
  * in the system database
  * 
  * @param string Course id field name
  * @param string Course id value
  * @return mixed System course id if the course was found, WSError otherwise
  */
 protected function getCourseId($course_id_field_name, $course_id_value)
 {
     if ($course_id_field_name == "chamilo_course_id") {
         if (CourseManager::get_course_code_from_course_id(intval($course_id_value)) != null) {
             return intval($course_id_value);
         } else {
             return new WSError(200, "Course not found");
         }
     } else {
         $course_code = CourseManager::get_course_code_from_original_id($course_id_value, $course_id_field_name);
         if (!empty($course_code)) {
             $course_info = CourseManager::get_course_information($course_code);
             return $course_info['id'];
         } else {
             return new WSError(200, "Course not found");
         }
         /*
         			if($course_code == 0) {
         				return new WSError(200, "Course not found");
         			} else {
         				return $course_info['id'];
         			}       
         */
     }
 }
	/**
	 * Edit course description
	 *
	 * @param string API secret key
	 * @param string Course id field name
	 * @param string Course id value
	 * @param int Category id from course description
	 * @param string Description title
	 * @param string Course description content
	 */
	public function EditCourseDescription($secret_key, $course_id_field_name, $course_id_value, $course_desc_id, $course_desc_title, $course_desc_content) {
		$verifKey = $this->verifyKey($secret_key);
		if($verifKey instanceof WSError) {
			$this->handleError($verifKey);
		} else {
			$course_id = $this->getCourseId($course_id_field_name, $course_id_value);
			if($course_id instanceof WSError) {
				return $course_id;
			} else {
				// Create the new course description
				$cd = new CourseDescription();
				$cd->set_description_type($course_desc_id);
				$cd->set_title($course_desc_title);
				$cd->set_content($course_desc_content);
				$cd->set_session_id(0);
				// Get course info
				$course_info = CourseManager::get_course_information(CourseManager::get_course_code_from_course_id($course_id));
				// Check if this course description exists
				$descriptions = CourseDescription::get_descriptions($course_id);
				$exists = false;
				foreach($descriptions as $description) {
					if($description->get_description_type() == $course_desc_id) {
						$exists = true;
					}
				}
				if (!$exists) {
					$cd->set_progress(0);
					$cd->insert($course_info['db_name']);
				} else {
					$cd->update($course_info['db_name']);
				}
			}
		}
	}
    /**
     * Unsubscribe course from a session
     *
     * @param int Session id
     * @param int Course id
     * @return bool True in case of success, false otherwise
     */
    public static function unsubscribe_course_from_session($session_id, $course_id)
    {
        $session_id = (int) $session_id;
        $course_id = (int) $course_id;

        $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
        $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
        $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);

        // Get course code
        $course_code = CourseManager::get_course_code_from_course_id($course_id);

        if (empty($course_code)) {
            return false;
        }

        // Unsubscribe course
        $sql = "DELETE FROM $tbl_session_rel_course
                WHERE course_code='$course_code' AND id_session='$session_id'";
        Database::query($sql);

        $nb_affected = Database::affected_rows();

        $sql = "DELETE FROM $tbl_session_rel_course_rel_user
                WHERE course_code='$course_code' AND id_session='$session_id'";
        Database::query($sql);

        if ($nb_affected > 0) {
            // Update number of courses in the session
            $sql = "UPDATE $tbl_session SET nbr_courses= nbr_courses + $nb_affected WHERE id='$session_id' ";
            Database::query($sql);
            return true;
        } else {
            return false;
        }
    }
// Filltering passed to this page parameters.
$accept_course_request = intval($_GET['accept_course_request']);
$delete_course_request = intval($_GET['delete_course_request']);
$request_info = intval($_GET['request_info']);
$message = trim(Security::remove_XSS(stripslashes(urldecode($_GET['message']))));
$is_error_message = !empty($_GET['is_error_message']);
$keyword = Database::escape_string(trim($_GET['keyword']));
if ($course_validation_feature) {
    /**
     * Acceptance and creation of the requested course.
     */
    if (!empty($accept_course_request)) {
        $course_request_code = CourseRequestManager::get_course_request_code($accept_course_request);
        $course_id = CourseRequestManager::accept_course_request($accept_course_request);
        if ($course_id) {
            $course_code = CourseManager::get_course_code_from_course_id($course_id);
            $message = sprintf(get_lang('CourseRequestAccepted'), $course_request_code, $course_code);
            $is_error_message = false;
        } else {
            $message = sprintf(get_lang('CourseRequestAcceptanceFailed'), $course_request_code);
            $is_error_message = true;
        }
    } elseif (!empty($request_info)) {
        $course_request_code = CourseRequestManager::get_course_request_code($request_info);
        $result = CourseRequestManager::ask_for_additional_info($request_info);
        if ($result) {
            $message = sprintf(get_lang('CourseRequestInfoAsked'), $course_request_code);
            $is_error_message = false;
        } else {
            $message = sprintf(get_lang('CourseRequestInfoFailed'), $course_request_code);
            $is_error_message = true;
function WSSubscribeUserToCourse($params) {
    global $debug;
    if (!WSHelperVerifyKey($params)) {
        return return_error(WS_ERROR_SECRET_KEY);
    }
    if ($debug) error_log('WSSubscribeUserToCourse params: '.print_r($params,1));
    $results = array();
    $userscourses = $params['userscourses'];
    foreach ($userscourses as $usercourse) {
        $original_course_id = $usercourse['course_id'];
        $original_user_id   = $usercourse['user_id'];
        $status = STUDENT;
        if ($usercourse['status']) {
            $status = $usercourse['status'];
        }

        $result = array(
            'original_user_id_value'    => $original_user_id['original_user_id_value'],
            'original_course_id_value'  => $original_course_id['original_course_id_value'],
            'result' => 1);

        // Get user id
        $user_id = UserManager::get_user_id_from_original_id($original_user_id['original_user_id_value'], $original_user_id['original_user_id_name']);
        if ($debug) error_log('WSSubscribeUserToCourse user_id: '.$user_id);

        if ($user_id == 0) {
            // If user was not found, there was a problem
            $result['result'] = 0;
        } else {
            // User was found
            $course_id = CourseManager::get_course_id_from_original_id($original_course_id['original_course_id_value'], $original_course_id['original_course_id_name']);
            if ($debug) error_log('WSSubscribeUserToCourse course_id: '.$course_id);
            if ($course_id == 0) {
                // Course was not found
                $result['result'] = 0;
            } else {
                $course_code = CourseManager::get_course_code_from_course_id($course_id);
                if ($debug) error_log('WSSubscribeUserToCourse course_code: '.$course_code);
                if (!CourseManager::add_user_to_course($user_id, $course_code, $status)) {
                    $result['result'] = 0;
                }
            }
        }
        $results[] = $result;
    }
    return $results;
}
 /**
  * Gets the real course id based on the course id field name and value. Note that if the course id field name is "chamilo_course_id", it will use the course id
  * in the system database
  *
  * @param string Course id field name
  * @param string Course id value
  * @return mixed System course id if the course was found, WSError otherwise
  */
 protected function getCourseId($course_id_field_name, $course_id_value)
 {
     if ($course_id_field_name == "chamilo_course_id") {
         if (CourseManager::get_course_code_from_course_id(intval($course_id_value)) != null) {
             return intval($course_id_value);
         } else {
             return new WSCMError(200, "Course not found");
         }
     } else {
         $courseId = CourseManager::get_course_code_from_original_id($course_id_value, $course_id_field_name);
         if (empty($courseId)) {
             return new WSCMError(200, "Course not found");
         } else {
             return $courseId;
         }
     }
 }
 /**
  * Gets status obtained in the given learning path by the given user,
  * assuming there is only one item (SCO) in the learning path
  *
  * @param string Secret key
  * @param string User id field name (use chamilo_user_id if none)
  * @param string User id value
  * @param string Course id field name (use chamilo_course_id if none)
  * @param string Course id value
  * @param int Learnpath ID
  * @param int Learnpath *ITEM* ID
  * @return string "not attempted", "passed", "completed", "failed", "incomplete"
  */
 public function GetLearnpathStatusSingleItem($secret_key, $user_id_field_name, $user_id_value, $course_id_field_name, $course_id_value, $learnpath_id, $learnpath_item_id)
 {
     $verifKey = $this->verifyKey($secret_key);
     if ($verifKey instanceof WSError) {
         $this->handleError($verifKey);
     } else {
         $user_id = $this->getUserId($user_id_field_name, $user_id_value);
         if ($user_id instanceof WSError) {
             return $user_id;
         }
         $course_id = $this->getCourseId($course_id_field_name, $course_id_value);
         if ($course_id instanceof WSError) {
             return $course_id;
         } else {
             $course_code = CourseManager::get_course_code_from_course_id($course_id);
         }
         $lp = new learnpath($course_code, $learnpath_id, $user_id);
         return $lp->items[$learnpath_item_id]->status;
     }
 }
	/**
	 * Change course subscription
	 *
	 * @param string Course id field name
	 * @param string Course id value
	 * @param string Session id field name
	 * @param string Session id value
	 * @param int State (1 to subscribe, 0 to unsubscribe)
	 * @return mixed True on success, WSError otherwise
	 */
	protected function changeCourseSubscription($course_id_field_name, $course_id_value, $session_id_field_name, $session_id_value, $state) {
		$session_id = $this->getSessionId($session_id_field_name, $session_id_value);
		if($session_id instanceof WSError) {
			return $session_id;
		} else {
			$course_id = $this->getCourseId($course_id_field_name, $course_id_value);
			if($course_id instanceof WSError) {
				return $course_id;
			} else {
				if($state  == 1) {
					$course_code = CourseManager::get_course_code_from_course_id($course_id);
					SessionManager::add_courses_to_session($session_id, array($course_code));
					return true;
				} else {
					$result = SessionManager::unsubscribe_course_from_session($session_id, $course_id);
					if ($result) {
						return true;
					} else {
						return new WSError(304, 'Error unsubscribing course from session');
					}
				}
			}
		}
    }