<?php
/**
* @package XenCentral Feedback System
* @author DNF Technology
* @copyright Drnoyan & Nalyan LDA, Portugal, EU
* @license http://dnf.technology/terms/
* @link http://customers.dnf.technology
* @version 2.0.0 Beta 10
* @revision 12
*/
namespace XenCentral\Feedback\Repository;
use XF\Db\Exception;
use XF\Mvc\Entity\Finder;
use XF\Mvc\Entity\Repository;
class User extends Repository
{
use FeedbackAbstractRepository;
public function getUserById($user_id)
{
$user_id=intval($user_id);
$userinfo=$this->db()->fetchAll('
SELECT user.*, userinfo.username FROM xf_xc_feedback_user AS user
LEFT JOIN xf_user AS userinfo ON userinfo.user_id=user.user_id
WHERE user.user_id = ?
', $user_id);
if(empty($userinfo))
{
// no user found so a default entry should be created for this user
$username=$this->db()->fetchOne("
SELECT username FROM xf_user
WHERE user_id=$user_id
");
if(empty($username)) {
$username=\XF::phrase('guest');
$user_id=0;
}
$userinfo=array('user_id'=>$user_id, 'username'=>$username);
}
return $this->_prepareUser($userinfo);
}
public function getUserNames ($query){
$where = "username LIKE " . "'" .\XF::app()->db()->escapeLike($query, '%?%') ."'" ;
$usernames=$this->db()->fetchAll("
SELECT username, user_id FROM xf_user
WHERE " . $where ."
");
return $usernames;
}
public function getTopTraders()
{
$users=$this->db()->fetchAll("
SELECT user.*, userinfo.username FROM xf_xc_feedback_user AS user
LEFT JOIN xf_user AS userinfo ON userinfo.user_id=user.user_id WHERE user.fb_positivetotal > 0
ORDER BY user.fb_total DESC
LIMIT " . $this->_getOptionsModel()->getMainPageLimit() . "
");
foreach($users as $key => $user)
{
$users[$key]=$this->_prepareUser($user);
}
return $users;
}
public function getBottomTraders()
{
$users=$this->db()->fetchAll("
SELECT user.*, userinfo.username FROM xf_xc_feedback_user AS user
LEFT JOIN xf_user AS userinfo ON userinfo.user_id=user.user_id
WHERE user.fb_negative > 0
ORDER BY user.fb_negative DESC, user.fb_percent ASC
LIMIT " . $this->_getOptionsModel()->getMainPageLimit() . "
");
foreach($users as $key => $user)
{
$users[$key]=$this->_prepareUser($user);
}
return $users;
}
public function getTopSellers()
{
$users=$this->db()->fetchAll("
SELECT user.*, userinfo.username FROM xf_xc_feedback_user AS user
LEFT JOIN xf_user AS userinfo ON userinfo.user_id=user.user_id
WHERE user.fb_negative>0
ORDER BY user.fb_negative DESC, user.fb_percent ASC
LIMIT " . $this->_getOptionsModel()->getMainPageLimit() . "
");
foreach($users as $key => $user)
{
$users[$key]=$this->_prepareUser($user);
}
return $users;
}
public function getTopBuyers()
{
$users=$this->db()->fetchAll("
SELECT user.*, userinfo.username FROM xf_xc_feedback_user AS user
LEFT JOIN xf_user AS userinfo ON userinfo.user_id=user.user_id
WHERE user.fb_negative>0
ORDER BY user.fb_negative DESC, user.fb_percent ASC
LIMIT " . $this->_getOptionsModel()->getMainPageLimit() . "
");
foreach($users as $key => $user)
{
$users[$key]=$this->_prepareUser($user);
}
return $users;
}
public function getTrader($user_id)
{
$users=$this->db()->fetchRow("
SELECT user.*, userinfo.username FROM xf_xc_feedback_user AS user
LEFT JOIN xf_user AS userinfo ON userinfo.user_id=user.user_id
WHERE user.user_id= ".$user_id."
");
if (empty($users)) {
$users = array( 'fb_total', 'fb_positivetotal', 'fb_positive', 'fb_negative', 'fb_neutral', 'fb_percent' );
$users = array_fill_keys( array_values( $users ), 0 );
};
return $users;
}
public function totalForUser($userid = false)
{
return $this->db()->fetchOne( "SELECT COUNT(*) FROM xf_xc_feedback_feedback WHERE foruserid = ?", array( $userid ) );
}
protected function _prepareUser( $user)
{
$defaultData=$this->_getDefaultData();
foreach ($defaultData AS $key=>$value)
{
if (!isset($user[$key]))
{
if (is_array($value) && empty($value))
{
$value=0;
}
$user[$key]=$value;
}
}
if (isset($user->fb_stats) && $user->fb_stats && !is_array($user->fb_stats))
{
$user->fb_stats=(array)unserialize($user->fb_stats);
}
return $user;
}
protected function _getDefaultData()
{
return array (
'fb_total'=>0,
'fb_positivetotal' => 0,
'fb_percent'=>0.0,
'fb_positive' => array (),
'fb_negative' => array (),
'fb_neutral' => array (),
'fb_stats' => array (
'month' => array (
'fb_positive' => 0,
'fb_neutral' => 0,
'fb_negative' => 0
),
'halfyear' => array (
'fb_positive' => 0,
'fb_neutral' => 0,
'fb_negative' => 0
),
'year' => array (
'fb_positive' => 0,
'fb_neutral' => 0,
'fb_negative' => 0
)
)
);
}
public function rebuildUserData($user_id)
{
if ($this->_getOptionsModel()->getRequireFeedbackReply()) {
$user_totals = $this->db()->fetchAll( "
SELECT * FROM xf_xc_feedback_feedback
WHERE foruserid=?
AND has_reply=1
", array(
$user_id
) );
}
else {
$user_totals = $this->db()->fetchAll( "
SELECT * FROM xf_xc_feedback_feedback
WHERE foruserid=?
", array(
$user_id
) );
}
if (empty($user_totals))
{
$user_totals=array();
}
$info=$this->_getDefaultData();
$fromuserids=array ();
foreach($user_totals as $feedback)
{
if($feedback['amount'] > 0)
{
$info['fb_positivetotal']++;
$key='fb_positive';
}
else if($feedback['amount'] < 0)
{
$key='fb_negative';
}
else
{
$key='fb_neutral';
}
$info[$key][]=$feedback['fromuserid'];
if(/*!in_array($feedback['fromuserid'], $fromuserids) || $this->_getOptionsModel()->getRatingStyle()==0*/true)
{
// store data for statistics block
if($feedback['dateline'] > \XF::$time - $this->_convertMonthsToSeconds(1))
{
$info['fb_stats']['month'][$key]++;
}
if($feedback['dateline'] > \XF::$time - $this->_convertMonthsToSeconds(6))
{
$info['fb_stats']['halfyear'][$key]++;
}
if($feedback['dateline'] > \XF::$time - $this->_convertMonthsToSeconds(12))
{
$info['fb_stats']['year'][$key]++;
}
}
$fromuserids[]=$feedback['fromuserid'];
}
if($this->_getOptionsModel()->getRatingStyle())
{
// eBay style rating
$info['fb_positive']=array_unique($info['fb_positive']);
$info['fb_negative']=array_unique($info['fb_negative']);
$info['fb_neutral']=array_unique($info['fb_neutral']);
}
$info['fb_positive']=count($info['fb_positive']);
$info['fb_negative']=count($info['fb_negative']);
$info['fb_neutral']=count($info['fb_neutral']);
$info['fb_total']=$info['fb_positive'] - $info['fb_negative'];
$fb_count=$info['fb_positive'] + $info['fb_negative'] + $info['fb_neutral'];
if($fb_count)
{
$info['fb_percent']=round(($info['fb_positive'] + $info['fb_neutral']) * 100 / $fb_count, 1);
}
else
{
$info['fb_percent']='0.0';
}
$info['fb_stats']=serialize($info['fb_stats']);
$this->db()->query("
REPLACE INTO xf_xc_feedback_user (user_id, fb_total, fb_positivetotal, fb_positive, fb_negative, fb_neutral, fb_percent, fb_stats)
VALUES (?, $info[fb_total], $info[fb_positivetotal], $info[fb_positive], $info[fb_negative],$info[fb_neutral], $info[fb_percent], ".$this->db()->quote($info['fb_stats']).")
", array (
$user_id
));
}
public function rebuild($start, $limit)
{
$start=intval($start);
$limit=intval($limit);
$users=$this->db()->fetchAll("
SELECT user_id FROM xf_user
ORDER BY user_id ASC
LIMIT $start, $limit
");
if (empty($users))
{
return false;
}
foreach ($users AS $user)
{
$this->rebuildUserData($user['user_id']);
}
return true;
}
public function rebuildFbUsers($start, $limit)
{
$start=intval($start);
$limit=intval($limit);
$users=$this->db()->fetchAll("
SELECT user_id FROM xf_xc_feedback_user
ORDER BY user_id ASC
LIMIT $start, $limit
");
if (empty($users))
{
return false;
}
foreach ($users AS $user)
{
$this->rebuildUserData($user['user_id']);
}
return true;
}
}