View file upload/src/addons/XenCentral/Feedback/Repository/User.php

File size: 8.4Kb
<?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;
    }
}