function updateUserCachedPoints($fbId, $always = false)
 {
     require_once PATH_CORE . '/classes/user.class.php';
     $userTable = new UserTable($this->db);
     $user = $userTable->getRowObject();
     $userinfoTable = new UserInfoTable($this->db);
     $userinfo = $userinfoTable->getRowObject();
     if ($userinfo->loadWhere("fbId={$fbId} " . ($always ? "" : "AND DATE_ADD(lastUpdateCachedPointsAndChallenges, INTERVAL 1 HOUR) < NOW()"))) {
         $userinfoTable->updateUserCachedPointsAndChallenges($userinfo->userid, &$user, &$userinfo, $weekOf);
     }
 }
    function updateCachedPointsAndChallenges($limit = 1000, $weekOf = '')
    {
        $this->log('updateCachedPointsAndChallenges...');
        if ($weekOf != '') {
            $this->log('Warning: weekOf = ' . $weekOf . ', specifying a date different from NOW() 
				will cache weekly totals for a different week than the frontend expects. Rerun without weekOf to reset this.');
        }
        // fields that need to be updated offline include
        /*
         * cachedPointTotal
         * cached
         */
        // other fields that might need/want to be updated include comments and stories, however these arent critical because
        // scan every use account and adjust the user level to match their cached points
        require_once PATH_CORE . '/classes/user.class.php';
        if ($limit == 0) {
            $useridList = $this->db->query("SELECT SQL_CALC_FOUND_ROWS\tuserid FROM UserInfo;");
            // $this->page->rowsPerPage
        } else {
            $useridList = $this->db->query("SELECT SQL_CALC_FOUND_ROWS\tuserid FROM UserInfo ORDER BY lastUpdateCachedPointsAndChallenges ASC LIMIT 0,{$limit}");
            // $this->page->rowsPerPage
        }
        $userTable = new UserTable($this->db);
        $user = $userTable->getRowObject();
        $userinfoTable = new UserInfoTable($this->db);
        $userinfo = $userinfoTable->getRowObject();
        if ($this->db->countQ($useridList) > 0) {
            while ($data = $this->db->readQ($useridList)) {
                if ($userinfoTable->updateUserCachedPointsAndChallenges($data->userid, &$user, &$userinfo, $weekOf)) {
                    //$this->log('updated user '. $data->userid.'<br/>');
                } else {
                    $this->log('updateCachedPointsAndChallenges: couldnt update for user ' . $data->userid);
                }
            }
        } else {
            $this->log('updateCachedPointsAndChallenges: got no user records!');
        }
    }
 function processPrizeOrder($prizeid, $userid, &$message)
 {
     require_once PATH_CORE . '/classes/user.class.php';
     require_once PATH_CORE . '/classes/prizes.class.php';
     require_once PATH_CORE . '/classes/orders.class.php';
     $orderTable = new OrderTable($this->db);
     $userTable = new UserTable($this->db);
     $userInfoTable = new UserInfoTable($this->db);
     $prizeTable = new PrizeTable($this->db);
     $user = $userTable->getRowObject();
     $userInfo = $userInfoTable->getRowObject();
     $prize = $prizeTable->getRowObject();
     $order = $orderTable->getRowObject();
     if (!$user->load($userid) || !$userInfo->load($userid) || !$prize->load($prizeid)) {
         $message = "There was an error loading prize and/or user records.";
         return false;
     }
     $userInfoTable->updateUserCachedPointsAndChallenges($userid, $user, $userInfo);
     // slightly inefficient, calls load again
     // final check, in case something else happened
     if (!$this->checkOrderPossible($prize, $user, $userinfo, $message)) {
         return false;
     }
     // everythings ok:
     if (!($prize->isWeekly || $prize->isGrand)) {
         $user->cachedPointTotal -= $prize->pointCost;
     }
     $prize->currentStock--;
     $order->userid = $user->userid;
     $order->prizeid = $prize->id;
     $order->pointCost = $prize->pointCost;
     // cache points spent in here for proper recordkeeping.
     $phpnow = time();
     $order->dateSubmitted = date('Y-m-d H:i:s', $phpnow);
     $order->status = 'submitted';
     if (!$order->insert()) {
         $message = 'Error submitting your order, please email support.';
         return false;
     }
     $user->update();
     $prize->update();
     $message .= 'Your order number is #' . $order->id . '.';
     // debatable -- should this show up in the log if its a weekly or grand prize?
     $log = $this->app->getActivityLog();
     $log->add($log->serialize(0, $this->page->session->userid, 'redeemed', $_POST['prizeid'], 0));
     return $order->id;
 }