| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316 | 
							- <?php
 
- /**
 
-  *
 
-  * PHP Pro Bid $Id$ /hUzA/d/lsDObXj/yDUpPZrTott3xGoV8tph/Uvm1Wo=
 
-  *
 
-  * @link        http://www.phpprobid.com
 
-  * @copyright   Copyright (c) 2015 Online Ventures Software & CodeCube SRL
 
-  * @license     http://www.phpprobid.com/license Commercial License
 
-  *
 
-  * @version     7.5
 
-  */
 
- /**
 
-  * reputation (feedback) table service class
 
-  */
 
- namespace Ppb\Service;
 
- use Ppb\Db\Table\Reputation as ReputationTable,
 
-     Cube\Db\Expr;
 
- class Reputation extends AbstractService
 
- {
 
-     const SALE = 'sale';
 
-     const PURCHASE = 'purchase';
 
-     /**
 
-      * positive rating threshold
 
-      * any rating that is above this value will be considered positive
 
-      */
 
-     const POSITIVE_THRESHOLD = 3;
 
-     /**
 
-      * reputation intervals
 
-      */
 
-     const INTERVAL_ONE_MONTH = 'INTERVAL 1 MONTH';
 
-     const INTERVAL_SIX_MONTHS = 'INTERVAL 6 MONTH';
 
-     const INTERVAL_TWELVE_MONTHS = 'INTERVAL 1 YEAR';
 
-     /**
 
-      *
 
-      * allowed reputation scores
 
-      *
 
-      * @var array
 
-      */
 
-     public static $scores = array(
 
-         5 => 'Positive',
 
-         3 => 'Neutral',
 
-         1 => 'Negative',
 
-     );
 
-     /**
 
-      *
 
-      * reputation intervals (used by the reputation details page)
 
-      *
 
-      * @var array
 
-      */
 
-     public static $intervals = array(
 
-         self::INTERVAL_ONE_MONTH     => 'Last Month',
 
-         self::INTERVAL_SIX_MONTHS    => 'Last 6 Months',
 
-         self::INTERVAL_TWELVE_MONTHS => 'Last 12 Months',
 
-     );
 
-     /**
 
-      *
 
-      * reputation icons
 
-      *
 
-      * @var array
 
-      */
 
-     public static $icons = array(
 
-         1   => '<i class="fa fa-star-o fa-lg star-yellow"></i>',
 
-         10  => '<i class="fa fa-star-o fa-lg star-green"></i>',
 
-         50  => '<i class="fa fa-star-o fa-lg star-blue"></i>',
 
-         100 => '<i class="fa fa-star-o fa-lg star-red"></i>',
 
-         200 => '<i class="fa fa-star-o fa-lg star-gold"></i>',
 
-     );
 
-     /**
 
-      *
 
-      * users table service
 
-      *
 
-      * @var \Ppb\Service\Users
 
-      */
 
-     protected $_users;
 
-     /**
 
-      *
 
-      * class constructor
 
-      */
 
-     public function __construct()
 
-     {
 
-         parent::__construct();
 
-         $this->setTable(
 
-             new ReputationTable());
 
-     }
 
-     /**
 
-      *
 
-      * get users table service
 
-      *
 
-      * @return \Ppb\Service\Users
 
-      */
 
-     public function getUsers()
 
-     {
 
-         if (!$this->_users instanceof Users) {
 
-             $this->setUsers(
 
-                 new Users());
 
-         }
 
-         return $this->_users;
 
-     }
 
-     /**
 
-      *
 
-      * set users table service
 
-      *
 
-      * @param \Ppb\Service\Users $users
 
-      *
 
-      * @return \Ppb\Service\Reputation
 
-      */
 
-     public function setUsers(Users $users)
 
-     {
 
-         $this->_users = $users;
 
-         return $this;
 
-     }
 
-     /**
 
-      *
 
-      * create or update an row in the reputation table
 
-      *
 
-      * @param array $data
 
-      * @param int   $posterId   force poster id in case the reputation is updated from the members module
 
-      *                          only the admin can update any reputation row
 
-      *
 
-      * @return \Ppb\Service\Reputation
 
-      */
 
-     public function save($data, $posterId = null)
 
-     {
 
-         $row = null;
 
-         $data = $this->_prepareSaveData($data);
 
-         if (array_key_exists('id', $data)) {
 
-             $select = $this->_table->select()
 
-                 ->where("id = ?", $data['id']);
 
-             unset($data['id']);
 
-             $row = $this->_table->fetchRow($select);
 
-         }
 
-         if (count($row) > 0) {
 
-             $data['updated_at'] = new Expr('now()');
 
-             $where = "id='{$row['id']}'";
 
-             if ($posterId !== null) {
 
-                 $where .= " AND poster_id = '" . intval($posterId) . "'";
 
-             }
 
-             $this->_table->update($data, $where);
 
-         }
 
-         else {
 
-             $data['created_at'] = new Expr('now()');
 
-             $this->_table->insert($data);
 
-         }
 
-         return $this;
 
-     }
 
-     /**
 
-      *
 
-      * save the data from a reputation form post
 
-      * this method will also update the reputation_data column in the users table
 
-      *
 
-      * @param array  $ids
 
-      * @param float  $score
 
-      * @param string $comments
 
-      * @param int    $posterId
 
-      *
 
-      * @return \Ppb\Service\Reputation
 
-      */
 
-     public function postReputation(array $ids, $score, $comments, $posterId = null)
 
-     {
 
-         foreach ($ids as $id) {
 
-             $this->save(array(
 
-                 'id'       => $id,
 
-                 'score'    => $score,
 
-                 'comments' => $comments,
 
-                 'posted'   => 1
 
-             ), $posterId);
 
-             $user = $this->findBy('id', $id)->findParentRow('\Ppb\Db\Table\Users', 'User');
 
-             $reputationData = serialize(array(
 
-                 'score'      => $this->getScore($user->getData('id')),
 
-                 'percentage' => $this->getPercentage($user->getData('id')),
 
-             ));
 
-             $user->save(array(
 
-                 'reputation_data' => $reputationData,
 
-             ));
 
-         }
 
-         return $this;
 
-     }
 
-     /**
 
-      *
 
-      * calculate the reputation score of a user based on different input variables
 
-      *
 
-      * @param int    $userId         the id of the user
 
-      * @param float  $score          score threshold
 
-      * @param string $operand        calculation operand
 
-      * @param string $reputationType reputation type to be calculated (sale, purchase)
 
-      * @param string $interval       calculation interval
 
-      *
 
-      * @return int                      resulted score
 
-      */
 
-     public function calculateScore($userId, $score = null, $operand = '=', $reputationType = null, $interval = null)
 
-     {
 
-         $select = $this->_table->select(array('total' => new Expr('count(*)')))
 
-             ->where('user_id = ?', $userId)
 
-             ->where('posted = ?', 1);
 
-         if ($score !== null) {
 
-             $select->where("score {$operand} ?", $score);
 
-         }
 
-         if (in_array($reputationType, array(self::SALE, self::PURCHASE))) {
 
-             $select->where('reputation_type = ?', $reputationType);
 
-         }
 
-         if (in_array($interval, array_keys(self::$intervals))) {
 
-             $select->where('updated_at >= date_sub(now(), ?)', new Expr($interval));
 
-         }
 
-         return $this->_table->fetchRow($select)->getData('total');
 
-     }
 
-     /**
 
-      *
 
-      * get the reputation score of a certain user
 
-      * the method will always get live values from the reputation table
 
-      *
 
-      * @param int $userId
 
-      *
 
-      * @return int
 
-      */
 
-     public function getScore($userId)
 
-     {
 
-         $positive = $this->calculateScore($userId, self::POSITIVE_THRESHOLD, '>');
 
-         $negative = $this->calculateScore($userId, self::POSITIVE_THRESHOLD, '<');
 
-         return $positive - $negative;
 
-     }
 
-     /**
 
-      *
 
-      * get the positive reputation percentage of a certain user
 
-      * the method will always get live values from the reputation table
 
-      *
 
-      * @param int $userId
 
-      *
 
-      * @return string
 
-      */
 
-     public function getPercentage($userId)
 
-     {
 
-         $all = $this->calculateScore($userId);
 
-         if (!$all) {
 
-             return 'n/a';
 
-         }
 
-         $positive = $this->calculateScore($userId, self::POSITIVE_THRESHOLD, '>');
 
-         $percentage = round($positive * 100 / $all);
 
-         return $percentage . '%';
 
-     }
 
-     /**
 
-      *
 
-      * reputation can only be deleted by the administrator, and only from the admin area
 
-      *
 
-      * @param array $ids reputation ids
 
-      *
 
-      * @return int the number of affected rows
 
-      */
 
-     public function delete(array $ids)
 
-     {
 
-         $result = 0;
 
-         foreach ($ids as $id) {
 
-             $user = $this->findBy('id', $id)->findParentRow('\Ppb\Db\Table\Users', 'User');
 
-             $result += $this->_table->delete(
 
-                 $this->_table->getAdapter()->quoteInto('id = ?', $id));
 
-             $reputationData = serialize(array(
 
-                 'score'      => $this->getScore($user->getData('id')),
 
-                 'percentage' => $this->getPercentage($user->getData('id')),
 
-             ));
 
-             $user->save(array(
 
-                 'reputation_data' => $reputationData,
 
-             ));
 
-         }
 
-         return $result;
 
-     }
 
- }
 
 
  |