/**
  * Change user level to higher one.
  *
  * <code>
  * $context = "com_user.registration";
  *
  * $keys = array(
  *     "id" => 1,
  *     "group_id" => 2
  * );
  *
  * // Create user badge object based.
  * $level  = new Gamification\Level\Level(\JFactory::getDbo());
  * $level->load($keys);
  *
  * $levelManager = new Gamification\User\Level\LevelManager(\JFactory::getDbo());
  * $levelManager->setLevel($level);
  *
  * if ($levelManager->give($context, $userId, $options)) {
  * // ...
  * }
  * </code>
  *
  * @param string $context
  * @param int $userId
  * @param array $options
  *
  * @throws \UnexpectedValueException
  * @throws \RuntimeException
  * @throws \InvalidArgumentException
  *
  * @return null|Level
  */
 public function levelUp($context, $userId, array $options = array())
 {
     if (!$this->level instanceof BasicLevel) {
         throw new \UnexpectedValueException('It is missing user level object.');
     }
     $keys = array('user_id' => $userId, 'group_id' => $this->level->getGroupId());
     $userLevel = new Level(\JFactory::getDbo());
     $userLevel->load($keys);
     // Implement JObservableInterface: Pre-processing by observers
     $this->observers->update('onBeforeLevelUp', array($context, &$userLevel, &$options));
     if (!$userLevel->getId()) {
         $keys['level_id'] = $this->level->getId();
         $userLevel->startLeveling($keys);
     } else {
         if ((int) $this->level->getId() === (int) $userLevel->getLevelId()) {
             return null;
         }
         // Change the current rank ID with another one.
         $userLevel->setLevelId($this->level->getId());
         $userLevel->store();
     }
     // Implement JObservableInterface: Post-processing by observers
     $this->observers->update('onAfterLevelUp', array($context, &$userLevel, &$options));
     return $userLevel;
 }
 public function isLevelAchieved(Level $level, $userId = 0)
 {
     if (!$userId and $this->id > 0) {
         $userId = $this->id;
     }
     $query = $this->db->getQuery(true);
     $query->select('COUNT(*)')->from($this->db->quoteName('#__gfy_userlevels', 'a'))->where('a.user_id  = ' . (int) $userId)->where('a.group_id = ' . (int) $level->getGroupId())->where('a.level_id = ' . (int) $level->getId());
     $this->db->setQuery($query, 0, 1);
     return (bool) $this->db->loadResult();
 }