File indexing completed on 2024-12-15 05:21:36

0001 <?php
0002 
0003 /**
0004  *  ocs-webserver
0005  *
0006  *  Copyright 2016 by pling GmbH.
0007  *
0008  *    This file is part of ocs-webserver.
0009  *
0010  *    This program is free software: you can redistribute it and/or modify
0011  *    it under the terms of the GNU Affero General Public License as
0012  *    published by the Free Software Foundation, either version 3 of the
0013  *    License, or (at your option) any later version.
0014  *
0015  *    This program is distributed in the hope that it will be useful,
0016  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
0017  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
0018  *    GNU Affero General Public License for more details.
0019  *
0020  *    You should have received a copy of the GNU Affero General Public License
0021  *    along with this program.  If not, see <http://www.gnu.org/licenses/>.
0022  **/
0023 class Application_Model_DbTable_ProjectRating extends Local_Model_Table
0024 {
0025 
0026     protected $_name = "project_rating";
0027 
0028     protected $_keyColumnsForRow = array('rating_id');
0029 
0030     protected $_key = 'rating_id';
0031 
0032 
0033     public static $options = array(1 => 'ugh', 2=>'really bad',3=>'bad',4=>'soso',5=>'average', 6=>'okay',7=>'good', 8=>'great', 9=>'excellent',10=>'the best');
0034 
0035     /**
0036      * @param int $project_id
0037      *
0038      * @return array
0039      */
0040     public function fetchRating($project_id)
0041     {
0042         $sql = "
0043                 SELECT
0044                    p.* ,
0045                    (SELECT `profile_image_url` FROM member m WHERE m.member_id = p.member_id)  AS profile_image_url,
0046                    (SELECT `username` FROM member m WHERE m.member_id = p.member_id)  AS username,
0047                    (SELECT `comment_text` FROM comments c WHERE c.comment_id = p.comment_id)  AS comment_text
0048                 FROM
0049                     project_rating p
0050                 WHERE
0051                     project_id = :project_id and rating_active = 1
0052                     ORDER BY created_at DESC
0053                 ;
0054                ";
0055         $result = $this->_db->query($sql, array('project_id' => $project_id))->fetchAll();
0056 
0057         return $result;
0058     }
0059 
0060     /**
0061      * @param int $project_id
0062      * @param int $member_id
0063      *
0064      * @return null
0065      */
0066     public function getProjectRateForUser($project_id, $member_id)
0067     {
0068         $sql = "
0069                 SELECT
0070                    p.* ,
0071                    (SELECT `comment_text` FROM comments c WHERE c.comment_id = p.comment_id)  AS comment_text
0072                 FROM
0073                     project_rating p
0074                 WHERE
0075                     project_id = :project_id
0076                     AND member_id = :member_id
0077                     AND rating_active = 1
0078                 ;
0079                ";
0080         $result = $this->_db->query($sql, array('project_id' => $project_id, 'member_id' => $member_id))->fetchAll();
0081         if (count($result) > 0) {
0082             return $result[0];
0083         } else {
0084             return null;
0085         }
0086     }
0087 
0088     /**
0089      * @param int $project_id
0090      *
0091      * @return mixed
0092      */
0093     public function fetchRatingCntActive($project_id)
0094     {
0095         $sql = "
0096                 SELECT
0097                    count(*)
0098                 FROM
0099                     project_rating p
0100                 WHERE
0101                     project_id = :project_id
0102                     AND rating_active = 1
0103                 ;
0104                ";
0105         $result = $this->_db->query($sql, array('project_id' => $project_id))->fetch();
0106 
0107         return $result;
0108     }
0109 
0110     public function getScore($project_id)
0111     {
0112           $sql = "select (sum(t.totalscore)+4*5)/(sum(t.count)+4)*100 as score
0113                     from
0114                     (
0115                         select project_id
0116                         ,user_like as likes
0117                         ,user_dislike as dislikes
0118                         ,1 as count
0119                         ,score as totalscore
0120                         from project_rating pr where pr.project_id=:project_id and pr.rating_active = 1
0121                     ) t
0122                 ";
0123 
0124         $result = $this->_db->query($sql, array('project_id' => $project_id))->fetchAll();
0125         if($result[0]['score'])
0126         {
0127             return $result[0]['score'];
0128          }else
0129          {
0130             return 500;
0131          }
0132     }
0133 
0134     // public function getScore($project_id)
0135     // {
0136     //       $sql = "select (sum(t.totalscore)+4*5)/(sum(t.count)+4)*100 as score
0137     //                 from
0138     //                 (
0139     //                     select project_id
0140     //                     ,user_like as likes
0141     //                     ,user_dislike as dislikes
0142     //                     ,1 as count
0143     //                     ,score as totalscore
0144     //                     from project_rating pr where pr.project_id=:project_id and pr.rating_active = 1
0145     //
0146     //                     union all
0147     //
0148     //                     select
0149     //                     project_id
0150     //                     ,user_like-6 as likes
0151     //                     ,user_dislike-6 as dislikes
0152     //                     ,user_like+user_dislike-12 as count
0153     //                     ,(user_like-6)*9+(user_dislike-6)*3 as totalscore
0154     //                     from project_rating pr
0155     //                     where pr.project_id=:project_id and pr.rating_active = 0 and user_dislike >=6 and user_like>=6
0156     //                 ) t
0157     //             ";
0158     //
0159     //     $result = $this->_db->query($sql, array('project_id' => $project_id))->fetchAll();
0160     //     if($result[0]['score'])
0161     //     {
0162     //         return $result[0]['score'];
0163     //      }else
0164     //      {
0165     //         return 500;
0166     //      }
0167     // }
0168 
0169     public function getScoreOld($project_id)
0170     {
0171         $sql = "
0172             SELECT laplace_score(sum(pr.user_like), sum(pr.user_dislike)) AS score
0173                 FROM project_rating AS pr
0174               WHERE pr.project_id = :project_id and (pr.rating_active = 1 or (rating_active=0 and user_like>1))
0175               ";
0176 
0177         $result = $this->_db->query($sql, array('project_id' => $project_id))->fetchAll();
0178         if($result[0]['score'])
0179         {
0180             return $result[0]['score'];
0181          }else
0182          {
0183             return 50;
0184          }
0185     }
0186 
0187     /**
0188      * @param int      $projectId
0189      * @param int      $member_id
0190      * @param int      $userRating
0191      * @param int|null $msg comment
0192      */
0193     public function rateForProject($projectId, $member_id, $userRating, $msg )
0194     {
0195         $msg = trim($msg);
0196         if(strlen($msg)<1) return;
0197         $userLikeIt = $userRating == 1 ? 1 : 0;
0198         $userDislikeIt = $userRating == 2 ? 1 : 0;
0199         $sql = 'select rating_id,comment_id from project_rating where project_id='.$projectId.'  and rating_active=1 and user_like='.$userLikeIt.' and user_dislike='.$userDislikeIt.' and member_id='.$member_id;
0200         $result = $this->getAdapter()->fetchRow($sql);
0201         $is_upvote=$userRating == 1 ? true : false;
0202         $is_exist = (($result!=null) && ($result['rating_id']!=null))?true:false;
0203         $modelComments = new Application_Model_ProjectComments(array('db' => 'db2'));
0204 
0205         // Zend_Registry::get('logger')->info($msg);
0206         if($is_exist){
0207             // this do cancel old rating .  remove rating & deactive
0208             $rating_id = $result['rating_id'];
0209             $comment_id = $result['comment_id'];
0210             $this->update(array('rating_active' => 0), 'rating_id=' . $rating_id);
0211             $modelComments->deactiveComment($comment_id);
0212             /*if($is_upvote){
0213                $this->rateUpdateProject($projectId,1);
0214             }else{
0215                 $this->rateUpdateProject($projectId,2);
0216             }*/
0217         }else{
0218             // this do first rating or change from - to + or + to -
0219             // first comment
0220             $data = array();
0221             $data['comment_target_id'] =$projectId;
0222             $data['comment_member_id'] =$member_id;
0223             $data['comment_parent_id'] = 0;
0224             $data['comment_text'] = $msg;
0225             $tableReplies = new Application_Model_ProjectComments(array('db' => 'db2'));
0226             $result = $tableReplies->save($data);
0227             $comment_id =  $result->comment_id;
0228 
0229             // get old rating
0230             $sql = 'select rating_id,comment_id,user_like from project_rating where project_id='.$projectId.'  and rating_active=1 and member_id='.$member_id;
0231             $result = $this->getAdapter()->fetchRow($sql);
0232             if($result!=null && $result['rating_id']!=null){
0233                  $this->update(array('rating_active' => 0), 'rating_id=' . $result['rating_id']);
0234                 $modelComments->deactiveComment($result['comment_id']);
0235             }
0236 
0237             if($userLikeIt==1)
0238             {
0239                 $score = 8;
0240             }else
0241             {
0242                 $score = 3;
0243             }
0244             $this->save(array(
0245                 'project_id'    => $projectId,
0246                 'member_id'     => $member_id,
0247                 'user_like'     => $userLikeIt,
0248                 'user_dislike'  => $userDislikeIt,
0249                 'score'         => $score,
0250                 'rating_active' => 1,
0251                 'comment_id'    => $comment_id
0252             ));
0253 
0254             // deal with project table ratings
0255             /*if(($result!=null) && ($result['rating_id']!=null)){
0256                 if($is_upvote){
0257                       $this->rateUpdateProject($projectId,5);
0258                 }else{
0259                      $this->rateUpdateProject($projectId,6);
0260                 }
0261             }else{
0262                 // first time rating
0263                 if($is_upvote){
0264                    $this->rateUpdateProject($projectId,3);
0265                 }else{
0266                     $this->rateUpdateProject($projectId,4);
0267                 }
0268             }*/
0269 
0270         }
0271 
0272 
0273     }
0274 
0275    
0276 
0277     /**
0278      * @param int      $projectId
0279      * @param int      $member_id
0280      * @param int      $userRating
0281      * @param int|null $msg comment
0282      */
0283     public function scoreForProject($projectId, $member_id, $score, $msg )
0284     {
0285         $msg = trim($msg);
0286         $score =(int)$score;
0287         if(strlen($msg)<1) return;
0288         if($score<6){
0289             $userLikeIt = 0;
0290             $userDislikeIt = 1;
0291         }else
0292         {
0293             $userLikeIt = 1;
0294             $userDislikeIt = 0;
0295         }
0296 
0297         $sql = 'select rating_id,comment_id from project_rating where project_id='.$projectId.'  and rating_active=1 and member_id='.$member_id;
0298         $result = $this->getAdapter()->fetchRow($sql);
0299 
0300         $is_upvote=$score<6 ? false : true;
0301 
0302         //$is_exist = (($result!=null) && ($result['rating_id']!=null))?true:false;
0303         $modelComments = new Application_Model_ProjectComments(array('db' => 'db2'));
0304 
0305         if($score<=0){
0306             // this do cancel old rating .  remove rating & deactive
0307             $rating_id = $result['rating_id'];
0308             $comment_id = $result['comment_id'];
0309             $this->update(array('rating_active' => 0), 'rating_id=' . $rating_id);
0310             $modelComments->deactiveComment($comment_id);
0311             /*if($is_upvote){
0312                $this->rateUpdateProject($projectId,1);
0313             }else{
0314                 $this->rateUpdateProject($projectId,2);
0315             }*/
0316         }else{
0317             // this do first rating or change from - to + or + to -
0318             // first comment
0319             $data = array();
0320             $data['comment_target_id'] =$projectId;
0321             $data['comment_member_id'] =$member_id;
0322             $data['comment_parent_id'] = 0;
0323             $data['comment_text'] = $msg;
0324             $result = $modelComments->save($data);
0325             $comment_id =  $result->comment_id;
0326 
0327             // get old rating
0328             $sql = 'select rating_id,comment_id from project_rating where project_id='.$projectId.'  and rating_active=1 and member_id='.$member_id;
0329             $result = $this->getAdapter()->fetchRow($sql);
0330             if($result!=null && $result['rating_id']!=null){
0331                  $this->update(array('rating_active' => 0), 'rating_id=' . $result['rating_id']);
0332                 $modelComments->deactiveComment($result['comment_id']);
0333             }
0334 
0335 
0336             $this->save(array(
0337                 'project_id'    => $projectId,
0338                 'member_id'     => $member_id,
0339                 'user_like'     => $userLikeIt,
0340                 'user_dislike'  => $userDislikeIt,
0341                 'score'         => $score,
0342                 'rating_active' => 1,
0343                 'comment_id'    => $comment_id
0344             ));
0345 
0346             // deal with project table ratings
0347             /*if(($result!=null) && ($result['rating_id']!=null)){
0348                 if($is_upvote){
0349                       $this->rateUpdateProject($projectId,5);
0350                 }else{
0351                      $this->rateUpdateProject($projectId,6);
0352                 }
0353             }else{
0354                 // first time rating
0355                 if($is_upvote){
0356                    $this->rateUpdateProject($projectId,3);
0357                 }else{
0358                     $this->rateUpdateProject($projectId,4);
0359                 }
0360             }*/
0361 
0362         }
0363 
0364 
0365     }
0366 
0367       /**
0368      * @param int      $projectId
0369      * @param int      $member_id
0370      * @param int      $userRating
0371      * @param int|null $msg comment
0372      */
0373       /*
0374     public function rateForProject($projectId, $member_id, $userRating, $msg )
0375     {
0376         $msg = trim($msg);
0377         if(strlen($msg)<1) return;
0378         $userLikeIt = $userRating == 1 ? 1 : 0;
0379         $userDislikeIt = $userRating == 2 ? 1 : 0;
0380         $sql = 'select rating_id,comment_id from project_rating where project_id='.$projectId.'  and rating_active=1 and user_like='.$userLikeIt.' and user_dislike='.$userDislikeIt.' and member_id='.$member_id;
0381         $result = $this->getAdapter()->fetchRow($sql);
0382         $is_upvote=$userRating == 1 ? true : false;
0383         $is_exist = (($result!=null) && ($result['rating_id']!=null))?true:false;
0384         $modelComments = new Default_Model_ProjectComments();
0385 
0386         // Zend_Registry::get('logger')->info($msg);
0387         if($is_exist){
0388             // this do cancel old rating .  remove rating & deactive
0389             $rating_id = $result['rating_id'];
0390             $comment_id = $result['comment_id'];
0391             $this->update(array('rating_active' => 0), 'rating_id=' . $rating_id);
0392             $modelComments->deactiveComment($comment_id);
0393             if($is_upvote){
0394                $this->rateUpdateProject($projectId,1);
0395             }else{
0396                 $this->rateUpdateProject($projectId,2);
0397             }
0398         }else{
0399             // this do first rating or change from - to + or + to -
0400             // first comment
0401             $data = array();
0402             $data['comment_target_id'] =$projectId;
0403             $data['comment_member_id'] =$member_id;
0404             $data['comment_parent_id'] = 0;
0405             $data['comment_text'] = $msg;
0406             $tableReplies = new Default_Model_ProjectComments();
0407             $result = $tableReplies->save($data);
0408             $comment_id =  $result->comment_id;
0409 
0410             // get old rating
0411             $sql = 'select rating_id,comment_id,user_like from project_rating where project_id='.$projectId.'  and rating_active=1 and member_id='.$member_id;
0412             $result = $this->getAdapter()->fetchRow($sql);
0413             if($result!=null && $result['rating_id']!=null){
0414                  $this->update(array('rating_active' => 0), 'rating_id=' . $result['rating_id']);
0415                 $modelComments->deactiveComment($result['comment_id']);
0416             }
0417 
0418             $this->save(array(
0419                 'project_id'    => $projectId,
0420                 'member_id'     => $member_id,
0421                 'user_like'     => $userLikeIt,
0422                 'user_dislike'  => $userDislikeIt,
0423                 'rating_active' => 1,
0424                 'comment_id'    => $comment_id
0425             ));
0426 
0427             // deal with project table ratings
0428             if(($result!=null) && ($result['rating_id']!=null)){
0429                 if($is_upvote){
0430                       $this->rateUpdateProject($projectId,5);
0431                 }else{
0432                      $this->rateUpdateProject($projectId,6);
0433                 }
0434             }else{
0435                 // first time rating
0436                 if($is_upvote){
0437                    $this->rateUpdateProject($projectId,3);
0438                 }else{
0439                     $this->rateUpdateProject($projectId,4);
0440                 }
0441             }
0442 
0443         }
0444 
0445 
0446     }*/
0447 
0448     /*private function rateUpdateProject($projectId,$action)
0449     {
0450         // $action ==1 => $project->count_likes - 1
0451         // $action ==2 => $project->count_dislikes - 1
0452         // $action ==3 => $project->count_likes + 1
0453         // $action ==4 => $project->count_dislikes + 1
0454         // $action ==5 => $project->count_likes+1 and $project->count_dislikes - 1
0455         // $action ==6 => $project->count_likes-1 and $project->count_dislikes +1
0456          $projectTable = new Default_Model_Project();
0457          $project = $projectTable->fetchProductInfo($projectId);
0458          if($action==1)
0459          {
0460             $numLikes = (int)$project->count_likes - 1;
0461             $updatearray = array('count_likes' => $numLikes);
0462          }else if($action==2)
0463          {
0464             $numLikes = (int)$project->count_dislikes - 1;
0465             $updatearray = array('count_dislikes' => $numLikes);
0466          }else if($action==3)
0467          {
0468             $numLikes = (int)$project->count_likes +1;
0469             $updatearray = array('count_likes' => $numLikes);
0470          }else if($action==4)
0471          {
0472             $numLikes = (int)$project->count_dislikes +1;
0473             $updatearray = array('count_dislikes' => $numLikes);
0474          }else if($action==5)
0475          {
0476             $numdisLikes = (int)$project->count_dislikes -1;
0477             $numLikes = (int)$project->count_likes +1;
0478             $updatearray = array('count_dislikes' => $numdisLikes,'count_likes' => $numLikes);
0479          }else if($action==6)
0480          {
0481             $numdisLikes = (int)$project->count_dislikes +1;
0482             $numLikes = (int)$project->count_likes -1;
0483             $updatearray = array('count_dislikes' => $numdisLikes,'count_likes' => $numLikes);
0484          }
0485          $projectTable->update($updatearray, 'project_id = ' . $projectId);
0486     }
0487 */
0488 
0489     /**
0490      * @param int $memberId
0491      *
0492      * @return array returns array of affected rows. can be empty.
0493      */
0494     public function setDeletedByMemberId($memberId)
0495     {
0496         $sql = "
0497             UPDATE {$this->_name}
0498             SET rating_active = 0
0499             WHERE member_id = :member_id AND rating_active = 1
0500         ";
0501 
0502         $sqlAffectedRows =
0503             "SELECT rating_id, project_id, user_like, user_dislike FROM {$this->_name} WHERE member_id = :member_id AND rating_active = 1";
0504         $affectedRows = $this->_db->fetchAll($sqlAffectedRows, array('member_id' => $memberId));
0505 
0506         $result = $this->_db->query($sql, array('member_id' => $memberId))->execute();
0507         if ($result) {
0508             return $affectedRows;
0509         }
0510 
0511         return array();
0512     }
0513 
0514     public function getRatedForMember($member_id)
0515     {
0516         $sql = "
0517                      SELECT
0518                        r.user_like
0519                        ,r.user_dislike
0520                        ,r.rating_active
0521                        ,r.created_at rating_created_at
0522                        ,(select `comment_text` from comments c where c.comment_id = r.comment_id)  as comment_text
0523                        ,r.project_id
0524                        ,r.score
0525                         ,p.member_id as project_member_id
0526                         ,p.username as project_username
0527                         ,p.project_category_id
0528                         ,p.status
0529                         ,p.title
0530                         ,p.description
0531                         ,p.image_small
0532                         ,p.project_created_at
0533                         ,p.project_changed_at
0534                         ,p.laplace_score
0535                         ,p.cat_title
0536                         ,p.count_likes
0537                         ,p.count_dislikes
0538                     FROM
0539                         project_rating r
0540                     inner join stat_projects p on r.project_id = p.project_id and p.status = 100
0541                     WHERE
0542                         r.member_id = :member_id
0543                         and r.rating_active = 1
0544                     order by r.created_at desc
0545         ";
0546         $result = $this->_db->query($sql, array('member_id' => $member_id))->fetchAll();
0547         return $result;
0548     }
0549 
0550 }