File indexing completed on 2024-05-12 05:58:46

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 
0024 use YoHang88\LetterAvatar\LetterAvatar;
0025 
0026 class Default_Model_Member extends Default_Model_DbTable_Member
0027 {
0028     const CASE_INSENSITIVE = 1;
0029 
0030     /**
0031      * @param int    $count
0032      * @param string $orderBy
0033      * @param string $dir
0034      *
0035      * @return Zend_Db_Table_Rowset
0036      * @throws Zend_Exception
0037      */
0038     public function fetchNewActiveMembers($count = 100, $orderBy = 'created_at', $dir = 'DESC')
0039     {
0040         if (empty($count)) {
0041             return $this->generateRowSet($this->createRow());
0042         }
0043 
0044         $allowedDirection = array('desc' => true, 'asc' => true);
0045         if (false == isset($allowedDirection[strtolower($dir)])) {
0046             $dir = null;
0047         }
0048 
0049         /** @var Zend_Cache_Core $cache */
0050         $cache = Zend_Registry::get('cache');
0051         $cacheName = __FUNCTION__ . md5($count . $orderBy . $dir);
0052         $members = $cache->load($cacheName);
0053 
0054         if ($members) {
0055             return $members;
0056         } else {
0057 
0058             $sql = '
0059               SELECT count(*) AS `total_count`
0060               FROM `member`
0061               WHERE `is_active` = :activeVal
0062                  AND `type` = :typeVal
0063                AND `profile_image_url` <> :defaultImgUrl
0064                AND `profile_image_url` LIKE :likeImgUrl
0065           ';
0066 
0067             $resultCnt = $this->_db->fetchRow($sql, array(
0068                 'activeVal'     => Default_Model_Member::MEMBER_ACTIVE,
0069                 'typeVal'       => Default_Model_Member::MEMBER_TYPE_PERSON,
0070                 'defaultImgUrl' => 'hive/user-pics/nopic.png',
0071                 'likeImgUrl'    => 'hive/user-bigpics/0/%'
0072             ));
0073 
0074             $totalcnt = $resultCnt['total_count'];
0075 
0076             if ($totalcnt > $count) {
0077                 $offset = ' offset ' . rand(0, $totalcnt - $count);
0078             } else {
0079                 $offset = '';
0080             }
0081 
0082             $sql = '
0083                 SELECT *
0084                 FROM `member`
0085                 WHERE `is_active` = :activeVal
0086                    AND `type` = :typeVal
0087                  AND `profile_image_url` <> :defaultImgUrl
0088                  AND `profile_image_url` LIKE :likeImgUrl
0089             ';
0090             //$sql .= ' ORDER BY ' . $this->_db->quoteIdentifier($orderBy) . ' ' . $dir;
0091 
0092             $sql .= ' LIMIT ' . $this->_db->quote($count, Zend_Db::INT_TYPE);
0093             $sql .= $offset;
0094 
0095             $resultMembers = $this->getAdapter()->query($sql, array(
0096                 'activeVal'     => Default_Model_Member::MEMBER_ACTIVE,
0097                 'typeVal'       => Default_Model_Member::MEMBER_TYPE_PERSON,
0098                 'defaultImgUrl' => 'hive/user-pics/nopic.png',
0099                 'likeImgUrl'    => 'hive/user-bigpics/0/%'
0100             ))->fetchAll();
0101 
0102             $resultSet = $this->generateRowSet($resultMembers);
0103 
0104             $cache->save($resultSet, $cacheName, array(), 14400);
0105 
0106             return $resultSet;
0107         }
0108     }
0109 
0110     /**
0111      * @param $data
0112      *
0113      * @return Zend_Db_Table_Rowset
0114      */
0115     protected function generateRowSet($data)
0116     {
0117         $classRowSet = $this->getRowsetClass();
0118 
0119         $returnRowSet = new $classRowSet(array(
0120             'table'    => $this,
0121             'rowClass' => $this->getRowClass(),
0122             'stored'   => true,
0123             'data'     => $data
0124         ));
0125 
0126         return $returnRowSet;
0127     }
0128 
0129     /**
0130      * @return array
0131      * @deprecated
0132      */
0133     public function getMembersForSelectList()
0134     {
0135         $selectArr =
0136             $this->_db->fetchAll("SELECT `member_id`,`username`,`firstname`, `lastname` FROM {$this->_name} WHERE is_active=1 AND is_deleted=0 ORDER BY username");
0137 
0138         $arrayModified = array();
0139 
0140         $arrayModified[0] = "Benutzer wählen";
0141         foreach ($selectArr as $item) {
0142             $tmpStr = ($item['firstname']) ? $item['firstname'] : "";
0143             $tmpStr .= ($item['lastname']) ? ", " . $item['lastname'] : "";
0144             $tmpStr = ($tmpStr != "") ? " (" . $tmpStr . ")" : "";
0145 
0146             $arrayModified[$item['member_id']] = stripslashes($item['username'] . $tmpStr);
0147         }
0148 
0149         return $arrayModified;
0150     }
0151 
0152     /**
0153      * @param int $member_id
0154      *
0155      * @param     $verification_value
0156      *
0157      * @return boolean returns true if successful
0158      * @throws Zend_Db_Statement_Exception
0159      */
0160     public function activateMemberFromVerification($member_id, $verification_value)
0161     {
0162         $sql = "
0163             UPDATE `member`
0164               STRAIGHT_JOIN `member_email` ON `member`.`member_id` = `member_email`.`email_member_id` AND `member_email`.`email_checked` IS NULL AND `member`.`is_deleted` = 0 AND `member_email`.`email_deleted` = 0
0165             SET `member`.`mail_checked` = 1, `member`.`is_active` = 1, `member`.`changed_at` = NOW(), `member_email`.`email_checked` = NOW()
0166             WHERE `member`.`member_id` = :memberId AND `member_email`.`email_verification_value` = :verificationValue;
0167         ";
0168         $stmnt = $this->_db->query($sql, array('memberId' => $member_id, 'verificationValue' => $verification_value));
0169 
0170         return $stmnt->rowCount() > 0 ? true : false;
0171     }
0172 
0173     /**
0174      * @param int $member_id
0175      *
0176      * @throws Zend_Exception
0177      */
0178     public function setDeleted($member_id)
0179     {
0180         $updateValues = array(
0181             'is_active'  => 0,
0182             'is_deleted' => 1,
0183             'deleted_at' => new Zend_Db_Expr('Now()'),
0184         );
0185         $this->update($updateValues, $this->_db->quoteInto('member_id=?', $member_id, 'INTEGER'));
0186 
0187         $memberLog = new Default_Model_MemberDeactivationLog();
0188         $memberLog->logMemberAsDeleted($member_id);
0189 
0190 
0191         $this->setMemberProjectsDeleted($member_id);
0192         $this->setMemberCommentsDeleted($member_id);
0193         $this->setMemberRatingsDeleted($member_id);
0194         $this->setMemberReportingsDeleted($member_id);
0195         $this->setMemberEmailsDeleted($member_id);
0196         //$this->setMemberPlingsDeleted($member_id);
0197         //$this->removeMemberProjectsFromSearch($member_id);
0198         $this->setDeletedInMaterializedView($member_id);
0199         $this->setDeletedInSubSystems($member_id);
0200     }
0201 
0202     //User ist mind. 1 jahr alt, user ist supporter, user hat minimum 20 kommentare
0203 
0204     private function setMemberProjectsDeleted($member_id)
0205     {
0206         $modelProject = new Default_Model_Project();
0207         $modelProject->setAllProjectsForMemberDeleted($member_id);
0208     }
0209 
0210     private function setMemberCommentsDeleted($member_id)
0211     {
0212         $modelComments = new Default_Model_ProjectComments();
0213         $modelComments->setAllCommentsForUserDeleted($member_id);
0214     }
0215 
0216     private function setMemberRatingsDeleted($member_id)
0217     {
0218         $modelRatings = new Default_Model_DbTable_ProjectRating();
0219         $affectedRows = $modelRatings->setDeletedByMemberId($member_id);
0220         if (false === empty($affectedRows)) {
0221             $modelProject = new Default_Model_DbTable_Project();
0222             $modelProject->deleteLikes($affectedRows);
0223         }
0224     }
0225 
0226     private function setMemberReportingsDeleted($member_id)
0227     {
0228         $modelReportsProject = new Default_Model_DbTable_ReportProducts();
0229         $modelReportsProject->setDeleteByMember($member_id);
0230         $modelReportsComments = new Default_Model_DbTable_ReportComments();
0231         $modelReportsComments->setDeleteByMember($member_id);
0232     }
0233 
0234     private function setMemberEmailsDeleted($member_id)
0235     {
0236         $modelEmail = new Default_Model_DbTable_MemberEmail();
0237         $modelEmail->setDeletedByMember($member_id);
0238     }
0239 
0240     private function setDeletedInMaterializedView($member_id)
0241     {
0242         $sql = "UPDATE `stat_projects` SET `status` = :new_status WHERE `member_id` = :member_id";
0243 
0244         $this->_db->query($sql,
0245             array('new_status' => Default_Model_DbTable_Project::PROJECT_DELETED, 'member_id' => $member_id))
0246                   ->execute();
0247     }
0248 
0249     private function setDeletedInSubSystems($member_id)
0250     {
0251         try {
0252             $id_server = new Default_Model_Ocs_OAuth();
0253             $id_server->deleteUser($member_id);
0254             Zend_Registry::get('logger')->debug(__METHOD__ . ' - oauth : ' . implode(PHP_EOL . " - ",
0255                     $id_server->getMessages()));
0256         } catch (Exception $e) {
0257             Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString());
0258         }
0259         try {
0260             $ldap_server = new Default_Model_Ocs_Ldap();
0261             $ldap_server->deleteUser($member_id);
0262             Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL . " - ",
0263                     $ldap_server->getMessages()));
0264         } catch (Exception $e) {
0265             Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString());
0266         }
0267         try {
0268             $openCode = new Default_Model_Ocs_Gitlab();
0269             $openCode->blockUser($member_id);
0270             $openCode->blockUserProjects($member_id);
0271             Zend_Registry::get('logger')->debug(__METHOD__ . ' - opencode : ' . implode(PHP_EOL . " - ",
0272                     $openCode->getMessages()));
0273         } catch (Exception $e) {
0274             Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString());
0275         }
0276         try {
0277             $forum = new Default_Model_Ocs_Forum();
0278             $forum->blockUser($member_id);
0279             $forum->blockUserPosts($member_id);
0280             Zend_Registry::get('logger')->debug(__METHOD__ . ' - forum : ' . implode(PHP_EOL . " - ",
0281                     $forum->getMessages()));
0282         } catch (Exception $e) {
0283             Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString());
0284         }
0285     }
0286 
0287     public function validDeleteMemberFromSpam($member_id)
0288     {
0289         $sql = 'SELECT 
0290               `m`.`created_at`
0291               , (`m`.`created_at`+ INTERVAL 12 MONTH < NOW()) `is_old`
0292               ,(SELECT count(1) FROM `comments` `c` WHERE `c`.`comment_member_id` = `m`.`member_id` AND `comment_active` = 1) `comments`
0293               ,(SELECT (DATE_ADD(max(`active_time`), INTERVAL 1 YEAR) > now()) FROM `support` `s`  WHERE `s`.`status_id` = 2  AND `s`.`member_id` =`m`.`member_id`) `is_supporter`
0294               FROM `member` `m` WHERE `member_id` = :member_id';
0295         $result = $this->_db->fetchRow($sql, array(
0296             'member_id' => $member_id,
0297         ));
0298         if ($result['is_supporter'] && $result['is_supporter'] == 1) {
0299             return false;
0300         }
0301         if ($result['is_old'] == 1 || $result['comments'] > 20) {
0302             return false;
0303         }
0304 
0305         return true;
0306     }
0307 
0308     /**
0309      * @param int $member_id
0310      *
0311      * @throws Zend_Db_Exception
0312      */
0313     public function setActivated($member_id)
0314     {
0315         $updateValues = array(
0316             'is_active'  => 1,
0317             'is_deleted' => 0,
0318             'changed_at' => new Zend_Db_Expr('Now()'),
0319             'deleted_at' => null
0320         );
0321 
0322         $this->update($updateValues, $this->_db->quoteInto('member_id=?', $member_id, 'INTEGER'));
0323 
0324         $memberLog = new Default_Model_MemberDeactivationLog();
0325         $memberLog->removeLogMemberAsDeleted($member_id);
0326 
0327         $this->setMemberProjectsActivated($member_id);
0328         $this->setMemberCommentsActivated($member_id);
0329         $this->setMemberEmailsActivated($member_id);
0330 
0331         $this->setActivatedInSubsystems($member_id);
0332 
0333         //$this->setMemberPlingsActivated($member_id);
0334     }
0335 
0336     private function setMemberProjectsActivated($member_id)
0337     {
0338         $modelProject = new Default_Model_Project();
0339         $modelProject->setAllProjectsForMemberActivated($member_id);
0340     }
0341 
0342     private function setMemberCommentsActivated($member_id)
0343     {
0344         $modelComment = new Default_Model_ProjectComments();
0345         $modelComment->setAllCommentsForUserActivated($member_id);
0346     }
0347 
0348     private function setMemberEmailsActivated($member_id)
0349     {
0350         $modelEmail = new Default_Model_DbTable_MemberEmail();
0351         $modelEmail->setActivatedByMember($member_id);
0352     }
0353 
0354     private function setActivatedInSubsystems($member_id)
0355     {
0356         try {
0357             $id_server = new Default_Model_Ocs_OAuth();
0358             $id_server->updateUser($member_id);
0359             Zend_Registry::get('logger')->debug(__METHOD__ . ' - oauth : ' . print_r($id_server->getMessages(), true));
0360         } catch (Exception $e) {
0361             Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString());
0362         }
0363         try {
0364             $ldap_server = new Default_Model_Ocs_Ldap();
0365             $ldap_server->createUser($member_id);
0366             Zend_Registry::get('logger')->debug(__METHOD__ . ' - ldap : ' . implode(PHP_EOL . " - ",
0367                     $ldap_server->getMessages()));
0368         } catch (Exception $e) {
0369             Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString());
0370         }
0371         try {
0372             $openCode = new Default_Model_Ocs_Gitlab();
0373             $openCode->unblockUser($member_id);
0374             $openCode->unblockUserProjects($member_id);
0375             Zend_Registry::get('logger')->debug(__METHOD__ . ' - opencode : ' . implode(PHP_EOL . " - ",
0376                     $openCode->getMessages()));
0377         } catch (Exception $e) {
0378             Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString());
0379         }
0380         try {
0381             $forum = new Default_Model_Ocs_Forum();
0382             $forum->unblockUser($member_id);
0383             $forum->unblockUserPosts($member_id);
0384             Zend_Registry::get('logger')->debug(__METHOD__ . ' - forum : ' . implode(PHP_EOL." - ", $forum->getMessages()));
0385         } catch (Exception $e) {
0386             Zend_Registry::get('logger')->err($e->getMessage() . PHP_EOL . $e->getTraceAsString());
0387         }
0388     }
0389 
0390     /**
0391      * @param int  $member_id
0392      *
0393      * @param bool $onlyNotDeleted
0394      *
0395      * @return Zend_Db_Table_Row
0396      * @throws Zend_Db_Statement_Exception
0397      */
0398     public function fetchMemberData($member_id, $onlyNotDeleted = true)
0399     {
0400         if (null === $member_id) {
0401             return null;
0402         }
0403 
0404         $sql = '
0405                 SELECT `m`.*, `member_email`.`email_address` AS `mail`, IF(ISNULL(`member_email`.`email_checked`),0,1) AS `mail_checked`, `member_email`.`email_address`, `mei`.`external_id`, `mei`.`gitlab_user_id`
0406                 FROM `member` AS `m`
0407                 JOIN `member_email` ON `m`.`member_id` = `member_email`.`email_member_id` AND `member_email`.`email_primary` = 1
0408                 LEFT JOIN `member_external_id` AS `mei` ON `mei`.`member_id` = `m`.`member_id`
0409                 WHERE
0410                     (`m`.`member_id` = :memberId)
0411         ';
0412 
0413         if ($onlyNotDeleted) {
0414             $sql .= " AND (m.is_deleted = " . self::MEMBER_NOT_DELETED . ")";
0415         }
0416 
0417         $result = $this->getAdapter()->query($sql, array('memberId' => $member_id))->fetch();
0418 
0419         $classRow = $this->getRowClass();
0420 
0421         return new $classRow(array('table' => $this, 'stored' => true, 'data' => $result));
0422     }
0423 
0424     /**
0425      * @param      $member_id
0426      * @param bool $onlyActive
0427      *
0428      * @return null|Zend_Db_Table_Row_Abstract
0429      * @throws Zend_Db_Statement_Exception
0430      */
0431     public function fetchMember($member_id, $onlyActive = true)
0432     {
0433         if (empty($member_id)) {
0434             return null;
0435         }
0436 
0437         $sql = "
0438                 SELECT `m`.*, `member_email`.`email_address` AS `mail`, IF(ISNULL(`member_email`.`email_checked`),0,1) AS `mail_checked`, `member_email`.`email_address`, `mei`.`external_id`
0439                 FROM `member` AS `m`
0440                 JOIN `member_email` ON `m`.`member_id` = `member_email`.`email_member_id` AND `member_email`.`email_primary` = 1
0441                 LEFT JOIN `member_external_id` AS `mei` ON `mei`.`member_id` = `m`.`member_id`
0442                 WHERE `m`.`member_id` = :memberId";
0443 
0444         if ($onlyActive) {
0445             $sql .= " AND `m`.`is_deleted` = " . self::MEMBER_NOT_DELETED . " AND `m`.`is_active` = " . self::MEMBER_ACTIVE;
0446         }
0447 
0448         $stmnt = $this->_db->query($sql, array('memberId' => $member_id));
0449 
0450         if ($stmnt->rowCount() == 0) {
0451             return null;
0452         }
0453 
0454         return $this->generateRowClass($stmnt->fetch());
0455     }
0456 
0457     /**
0458      * @param string $user_name
0459      *
0460      * @return Zend_Db_Table_Row
0461      */
0462     public function fetchMemberFromHiveUserName($user_name)
0463     {
0464         $sql = "
0465                 SELECT *
0466                 FROM `member`
0467             WHERE `source_id` = :sourceId
0468                   AND `username` = :userName
0469                 ";
0470 
0471         return $this->_db->fetchRow($sql,
0472             array('sourceId' => Default_Model_Member::SOURCE_HIVE, 'userName' => $user_name));
0473     }
0474 
0475     /**
0476      * @param string $user_name
0477      *
0478      * @return Zend_Db_Table_Row
0479      */
0480     public function fetchMemberFromHiveUserId($user_id)
0481     {
0482         $sql = "
0483                 SELECT *
0484                 FROM `member`
0485           WHERE `source_id` = :sourceId
0486                 AND `source_pk` = :userId
0487                 ";
0488 
0489         return $this->_db->fetchRow($sql, array('sourceId' => Default_Model_Member::SOURCE_HIVE, 'userId' => $user_id));
0490     }
0491 
0492     /**
0493      * @param int $member_id
0494      * @param int $limit
0495      *
0496      * @return Zend_Db_Table_Rowset
0497      */
0498     public function fetchFollowedMembers($member_id, $limit = null)
0499     {
0500         $sql = "
0501                 SELECT member_follower.member_id,
0502                        member_follower.follower_id,
0503                        member.*
0504                 FROM member_follower
0505                 LEFT JOIN member ON member_follower.member_id = member.member_id
0506             WHERE member_follower.follower_id = :followerId
0507                   AND member.is_active = :activeVal
0508                 GROUP BY member_follower.member_id
0509                 ORDER BY max(member_follower.member_follower_id) DESC
0510                 ";
0511 
0512         if (null != $limit) {
0513             $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER');
0514         }
0515 
0516         $result = $this->_db->fetchAll($sql, array('followerId' => $member_id, 'activeVal' => self::MEMBER_ACTIVE));
0517 
0518         return $this->generateRowSet($result);
0519     }
0520 
0521     /**
0522      * @param int  $member_id
0523      * @param null $limit
0524      *
0525      * @return Zend_Db_Table_Rowset_Abstract
0526      */
0527     public function fetchFollowedProjects($member_id, $limit = null)
0528     {
0529         $sql = "
0530                 SELECT `project_follower`.`project_id`,
0531                         `project`.`title`,
0532                         `project`.`image_small`                                              
0533                 FROM `project_follower`
0534                   JOIN `project` ON `project_follower`.`project_id` = `project`.`project_id`                 
0535                   WHERE `project_follower`.`member_id` = :member_id
0536                   AND `project`.`status` = :project_status
0537                   AND `project`.`type_id` = 1               
0538                 ORDER BY `project_follower`.`project_follower_id` DESC
0539                 ";
0540 
0541         if (null != $limit) {
0542             $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER');
0543         }
0544 
0545         $result =
0546             $this->_db->fetchAll($sql,
0547                 array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE));
0548 
0549         return $this->generateRowSet($result);
0550     }
0551 
0552     public function fetchPlingedProjects($member_id, $limit = null)
0553     {
0554         $sql = "
0555                 SELECT project_category.title AS catTitle,
0556                        project.*,
0557                  member.*,
0558                plings.*
0559                 FROM plings
0560                 LEFT JOIN project ON plings.project_id = project.project_id
0561                 LEFT JOIN project_category ON project.project_category_id = project_category.project_category_id
0562             LEFT JOIN member ON project.member_id = member.member_id
0563             WHERE plings.member_id = :member_id
0564             AND plings.status_id = 2
0565                   AND project.status = :project_status
0566                   AND project.type_id = 1
0567                 ORDER BY plings.create_time DESC
0568                 ";
0569 
0570         if (null != $limit) {
0571             $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER');
0572         }
0573 
0574         $result =
0575             $this->_db->fetchAll($sql,
0576                 array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE));
0577 
0578         return $this->generateRowSet($result);
0579     }
0580 
0581     public function fetchProjectsSupported($member_id, $limit = null)
0582     {
0583         $sql = "
0584                 SELECT `project_category`.`title` AS `catTitle`,
0585                        `project`.`project_id`,
0586                        `project`.`title`,
0587                        `project`.`image_small`,
0588                        `plings`.`member_id`,
0589                        `plings`.`amount`,
0590                        `plings`.`create_time`,
0591                        `member`.`profile_image_url`,
0592                        `member`.`username`
0593 
0594                 FROM `plings`
0595                 JOIN `project` ON `plings`.`project_id` = `project`.`project_id`
0596                 JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id`
0597                 JOIN `member` ON `plings`.`member_id` = `member`.`member_id`
0598                 WHERE `project`.`member_id` = :member_id
0599                   AND `plings`.`status_id` = 2
0600                   AND `project`.`status` = :project_status
0601                   AND `project`.`type_id` = 1
0602                 ORDER BY `plings`.`create_time` DESC
0603                 ";
0604 
0605         if (null != $limit) {
0606             $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER');
0607         }
0608 
0609         $result =
0610             $this->_db->fetchAll($sql,
0611                 array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE));
0612 
0613         return $this->generateRowSet($result);
0614     }
0615 
0616     /**
0617      * @param $userData
0618      *
0619      * @return array
0620      * @throws Exception
0621      */
0622     public function createNewUser($userData)
0623     {
0624         $uuidMember = Local_Tools_UUID::generateUUID();
0625 
0626         if (false == isset($userData['password'])) {
0627             throw new Exception(__METHOD__ . ' - user password is not set.');
0628         }
0629         $userData['password'] = Local_Auth_Adapter_Ocs::getEncryptedPassword($userData['password'],Default_Model_DbTable_Member::SOURCE_LOCAL);
0630         if (false == isset($userData['roleId'])) {
0631             $userData['roleId'] = self::ROLE_ID_DEFAULT;
0632         }
0633         if ((false == isset($userData['avatar'])) OR (false == isset($userData['profile_image_url']))) {
0634             $imageFilename = $this->generateIdentIcon($userData, $uuidMember);
0635             $userData['avatar'] = $imageFilename;
0636             $userData['profile_image_url'] = IMAGES_MEDIA_SERVER . '/cache/200x200-2/img/' . $imageFilename;
0637         }
0638         if (false == isset($userData['uuid'])) {
0639             $userData['uuid'] = $uuidMember;
0640         }
0641         if (false == isset($userData['mail_checked'])) {
0642             $userData['mail_checked'] = 0;
0643         }
0644 
0645         //email is allways lower case
0646         $userData['mail'] = strtolower(trim($userData['mail']));
0647 
0648         $newUser = $this->storeNewUser($userData)->toArray();
0649 
0650         $memberMail = $this->createPrimaryMailAddress($newUser);
0651         $externalId = $this->createExternalId($newUser['member_id']);
0652 
0653         $newUser['verificationVal'] = $memberMail->email_verification_value;
0654         $newUser['externalId'] = $externalId;
0655 
0656         return $newUser;
0657     }
0658 
0659     /**
0660      * @param $userData
0661      * @param $uuidMember
0662      *
0663      * @return string
0664      * @throws Exception
0665      */
0666     protected function generateIdentIcon($userData, $uuidMember)
0667     {
0668         require_once 'vendor/autoload.php';
0669         // $name = substr($userData['username'],0,1).' '.substr($userData['username'],1);
0670         $name = $userData['username'] . '  ';
0671         $avatar = new LetterAvatar($name, 'square', 400);
0672         $tmpImagePath = IMAGES_UPLOAD_PATH . 'tmp/' . $uuidMember . '.png';
0673         $avatar->saveAs($tmpImagePath, LetterAvatar::MIME_TYPE_PNG);
0674         $imageService = new Default_Model_DbTable_Image();
0675         $imageFilename = $imageService->saveImageOnMediaServer($tmpImagePath);
0676 
0677         return $imageFilename;
0678     }
0679 
0680     /**
0681      * @param array $userData
0682      *
0683      * @return Zend_Db_Table_Row_Abstract
0684      */
0685     public function storeNewUser($userData)
0686     {
0687         $newUserData = $this->createRow($userData);
0688         $newUserData->save();
0689 
0690         //create a user specified main project in project table
0691         $projectId = $this->createPersonalProject($newUserData->toArray());
0692 
0693         //and save the id in member table
0694         $newUserData->main_project_id = $projectId;
0695         $newUserData->save();
0696 
0697         return $newUserData;
0698     }
0699 
0700     /**
0701      * @param array $userData
0702      *
0703      * @return mixed $projectId
0704      */
0705     protected function createPersonalProject($userData)
0706     {
0707         $tableProject = new Default_Model_Project();
0708         /** @var Default_Model_DbRow_Project $newPersonalProject */
0709         $newPersonalProject = $tableProject->createRow($userData);
0710         $newPersonalProject->uuid = Local_Tools_UUID::generateUUID();
0711         $newPersonalProject->project_category_id = $newPersonalProject::CATEGORY_DEFAULT_PROJECT;
0712         $newPersonalProject->status = $newPersonalProject::STATUS_PROJECT_ACTIVE;
0713         $newPersonalProject->image_big = $newPersonalProject::DEFAULT_AVATAR_IMAGE;
0714         $newPersonalProject->image_small = $newPersonalProject::DEFAULT_AVATAR_IMAGE;
0715         $newPersonalProject->creator_id = $userData['member_id'];
0716         $newPersonalProject->title = $newPersonalProject::PERSONAL_PROJECT_TITLE;
0717         $projectId = $newPersonalProject->save();
0718 
0719         return $projectId;
0720     }
0721 
0722     /**
0723      * @param array $newUser
0724      * @return Zend_Db_Table_Row_Abstract
0725      * @throws Zend_Db_Statement_Exception
0726      * @throws Zend_Db_Table_Exception
0727      * @throws Zend_Exception
0728      */
0729     private function createPrimaryMailAddress($newUser)
0730     {
0731         $modelEmail = new Default_Model_MemberEmail();
0732         $userMail = $modelEmail->saveEmailAsPrimary($newUser['member_id'], $newUser['mail'], $newUser['mail_checked']);
0733 
0734         return $userMail;
0735     }
0736 
0737     /**
0738      * @param int $member_id
0739      *
0740      * @return string
0741      */
0742     private function createExternalId($member_id)
0743     {
0744         $modelExternalId = new Default_Model_DbTable_MemberExternalId();
0745         $externalId = $modelExternalId->createExternalId($member_id);
0746 
0747         return $externalId;
0748     }
0749 
0750     public function fetchTotalMembersCount()
0751     {
0752         $sql = "
0753                 SELECT
0754                     count(1) AS `total_member_count`
0755                 FROM
0756                     `member`
0757                ";
0758 
0759         $result = $this->_db->fetchRow($sql);
0760 
0761         return $result['total_member_count'];
0762     }
0763 
0764     public function fetchTotalMembersInStoreCount()
0765     {
0766         $sql = "
0767                 SELECT
0768                     count(1) AS `total_member_count`
0769                 FROM
0770                     `member`
0771                ";
0772 
0773         $result = $this->_db->fetchRow($sql);
0774 
0775         return $result['total_member_count'];
0776     }
0777 
0778     /**
0779      * @param string $email
0780      *
0781      * @return null|Zend_Db_Table_Row_Abstract
0782      * @deprecated
0783      */
0784     public function fetchCheckedActiveLocalMemberByEmail($email)
0785     {
0786         $sel = $this->select()->where('mail=?', $email)->where('is_deleted = ?',
0787             Default_Model_DbTable_Member::MEMBER_NOT_DELETED)
0788                     ->where('is_active = ?', Default_Model_DbTable_Member::MEMBER_ACTIVE)
0789                     ->where('mail_checked = ?', Default_Model_DbTable_Member::MEMBER_MAIL_CHECKED)
0790                     ->where('login_method = ?', Default_Model_DbTable_Member::MEMBER_LOGIN_LOCAL);
0791 
0792         return $this->fetchRow($sel);
0793     }
0794 
0795     public function fetchEarnings($member_id, $limit = null)
0796     {
0797         $sql = "
0798                 SELECT `project_category`.`title` AS `catTitle`,
0799                        `project`.*,
0800                        `member`.*,
0801                        `plings`.*
0802                 FROM `plings`
0803                  JOIN `project` ON `plings`.`project_id` = `project`.`project_id`
0804                  JOIN `project_category` ON `project`.`project_category_id` = `project_category`.`project_category_id`
0805                  JOIN `member` ON `project`.`member_id` = `member`.`member_id`
0806                 WHERE `plings`.`status_id` = 2
0807                   AND `project`.`status` = :status
0808                   AND `project`.`type_id` = 1
0809                   AND `project`.`member_id` = :memberId
0810                 ORDER BY `plings`.`create_time` DESC
0811                 ";
0812 
0813         if (null != $limit) {
0814             $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER');
0815         }
0816 
0817         $result = $this->_db->fetchAll($sql,
0818             array('memberId' => $member_id, 'status' => Default_Model_Project::PROJECT_ACTIVE));
0819 
0820         return $this->generateRowSet($result);
0821     }
0822 
0823     /**
0824      * Finds an active user by given username or email ($identity)
0825      * Returns an empty rowset when no user found.
0826      *
0827      * @param string $identity could be the username or users mail address
0828      * @param bool   $withLoginLocal
0829      *
0830      * @return Zend_Db_Table_Row_Abstract
0831      */
0832     public function findActiveMemberByIdentity($identity, $withLoginLocal = false)
0833     {
0834         $sqlName = "SELECT * FROM `member` WHERE `is_active` = :active AND `is_deleted` = :deleted AND `username` = :identity";
0835         $sqlMail = "SELECT * FROM `member` WHERE `is_active` = :active AND `is_deleted` = :deleted AND `mail` = :identity";
0836         if ($withLoginLocal) {
0837             $sqlName .= " AND login_method = '" . self::MEMBER_LOGIN_LOCAL . "'";
0838             $sqlMail .= " AND login_method = '" . self::MEMBER_LOGIN_LOCAL . "'";
0839         }
0840 
0841         // test identity as username
0842         $resultName = $this->getAdapter()->fetchRow($sqlName,
0843             array('active' => self::MEMBER_ACTIVE, 'deleted' => self::MEMBER_NOT_DELETED, 'identity' => $identity));
0844         if ((false !== $resultName) AND (count($resultName) > 0)) {
0845             return $this->generateRowClass($resultName);
0846         }
0847 
0848         // test identity as mail
0849         $resultMail = $this->getAdapter()->fetchRow($sqlMail,
0850             array('active' => self::MEMBER_ACTIVE, 'deleted' => self::MEMBER_NOT_DELETED, 'identity' => $identity));
0851         if ((false !== $resultMail) AND (count($resultMail) > 0)) {
0852             return $this->generateRowClass($resultMail);
0853         }
0854 
0855         return $this->createRow();
0856     }
0857 
0858     /**
0859      * @param string $username
0860      * @return mixed
0861      */
0862     public function findActiveMemberByName($username)
0863     {
0864         $username = strtolower($username);
0865         $sql = '
0866           select m.member_id,m.username,profile_image_url 
0867           from member m 
0868           where m.is_active=1 and m.is_deleted = 0 and LOWER(m.username) like "' . $username . '%"
0869           limit 10
0870       ';
0871         $result = $this->getAdapter()->fetchAll($sql);
0872 
0873         return $result;
0874     }
0875 
0876     /**
0877      * @param string $hash
0878      * @param bool   $only_active
0879      *
0880      * @return array | false
0881      */
0882     public function findMemberForMailHash($hash, $only_active = true)
0883     {
0884         $sql = "
0885             SELECT `m`.* 
0886             FROM `member_email` AS `me`
0887             JOIN `member` AS `m` ON `m`.`member_id` = `me`.`email_member_id`
0888             WHERE `me`.`email_hash` = :email_hash
0889         ";
0890 
0891         if ($only_active) {
0892             $sql .= " `m`.`is_active` = 1 AND `m`.`is_deleted` = 0";
0893         }
0894 
0895         $member = $this->getAdapter()->fetchRow($sql, array('email_hash' => $hash));
0896 
0897         if (empty($member)) {
0898             return false;
0899         }
0900 
0901         return $member;
0902     }
0903 
0904     /**
0905      * @param Zend_Db_Table_Row_Abstract $memberData
0906      *
0907      * @return bool
0908      */
0909     public function isHiveUser($memberData)
0910     {
0911         if (empty($memberData)) {
0912             return false;
0913         }
0914         //20180801 ronald: If a hive user change his password, he gets the ocs password type and we do
0915         //have to check against the old hive password style
0916         //if ($memberData->source_id == self::SOURCE_HIVE) {
0917         //    return true;
0918         //}
0919         if ($memberData->password_type == self::PASSWORD_TYPE_HIVE) {
0920             return true;
0921         }
0922 
0923         return false;
0924     }
0925 
0926     public function fetchActiveHiveUserByUsername($username)
0927     {
0928         $sql = 'SELECT * FROM member WHERE username = :username AND is_active = 1 AND member.source_id = 1 AND member.is_deleted = 0';
0929 
0930         $result = $this->getAdapter()->query($sql, array('username' => $username))->fetch();
0931 
0932         return $result;
0933     }
0934 
0935     /**
0936      * @param $username
0937      * @return int|null
0938      * @throws Zend_Db_Statement_Exception
0939      */
0940     public function fetchActiveUserByUsername($username)
0941     {
0942         $sql = 'SELECT DISTINCT `member`.`member_id`
0943                 FROM `member`
0944                 WHERE LOWER(`username`) = :username
0945                 AND `is_active` = 1 
0946                 AND `member`.`is_deleted` = 0';
0947 
0948         $result = $this->getAdapter()->query($sql, array('username' => strtolower($username)))->fetchAll();
0949 
0950         if ($result && count($result) > 0) {
0951             $member_id = (int)$result[0]['member_id'];
0952 
0953             return $member_id;
0954         }
0955 
0956         return null;
0957     }
0958 
0959     public function fetchCommentsCount($member_id)
0960     {
0961         $sql = "
0962                   SELECT
0963                       count(1) AS count
0964                   FROM
0965                       comments 
0966                   where comment_target_id <> 0 and comment_member_id = :member_id and comment_active = :comment_status
0967                  ";
0968         $result = $this->_db->fetchRow($sql, array(
0969             'member_id'      => $member_id,
0970             'comment_status' => Default_Model_DbTable_Comments::COMMENT_ACTIVE
0971         ));
0972 
0973         return $result['count'];
0974     }
0975 
0976     /**
0977      * @param      $member_id
0978      * @param null $limit
0979      *
0980      * @return Zend_Paginator
0981      * @throws Zend_Paginator_Exception
0982      */
0983     public function fetchComments($member_id, $limit = null)
0984     {
0985         $result = $this->fetchCommentsList($member_id, $limit);
0986         if (count($result) > 0) {
0987             return new Zend_Paginator(new Zend_Paginator_Adapter_Array($result));
0988         } else {
0989             return new Zend_Paginator(new Zend_Paginator_Adapter_Array(array()));
0990         }
0991     }
0992 
0993     /**
0994      * @param      $member_id
0995      * @param null $limit
0996      *
0997      * @return Zend_Paginator
0998      * @throws Zend_Paginator_Exception
0999      */
1000     public function fetchCommentsList($member_id, $limit = null)
1001     {
1002         $sql = '
1003             SELECT
1004                 `comment_id`
1005                 ,`comment_text`
1006                 ,`member`.`member_id`
1007                 ,`member`.`profile_image_url`
1008                 ,`comment_created_at`
1009                 ,`stat_projects`.`username`
1010                 ,`stat_projects`.`project_member_id`
1011                 ,`comment_target_id`
1012                 ,`stat_projects`.`title`
1013                 ,`stat_projects`.`project_id`      
1014                 ,`stat_projects`.`laplace_score`
1015                 ,`stat_projects`.`count_likes`
1016                 ,`stat_projects`.`count_dislikes`
1017                 ,`stat_projects`.`image_small` 
1018                 ,`stat_projects`.`version`
1019                 ,`stat_projects`.`cat_title`
1020                 ,`stat_projects`.`count_comments`
1021                 ,`stat_projects`.`changed_at`
1022                 ,`stat_projects`.`created_at`        
1023             FROM `comments`
1024             INNER JOIN  `member` ON `comments`.`comment_member_id` = `member`.`member_id`
1025             INNER JOIN `stat_projects` ON `comments`.`comment_target_id` = `stat_projects`.`project_id` AND `comments`.`comment_type` = 0
1026             WHERE `comments`.`comment_active` = :comment_status
1027             AND `stat_projects`.`status` = :project_status
1028             AND `comments`.`comment_member_id` = :member_id
1029             ORDER BY `comments`.`comment_created_at` DESC
1030         ';
1031 
1032         if (isset($limit)) {
1033             $sql .= ' limit ' . (int)$limit;
1034         }
1035         $result = $this->_db->fetchAll($sql, array(
1036             'member_id'      => $member_id,
1037             'project_status' => Default_Model_DbTable_Project::PROJECT_ACTIVE,
1038             'comment_status' => Default_Model_DbTable_Comments::COMMENT_ACTIVE
1039         ));
1040 
1041         return $result;
1042     }
1043 
1044     public function fetchCntSupporters($member_id)
1045     {
1046         $sql = '
1047                 SELECT DISTINCT `plings`.`member_id` FROM `plings`
1048                  JOIN `project` ON `plings`.`project_id` = `project`.`project_id`                
1049                  JOIN `member` ON `project`.`member_id` = `member`.`member_id`
1050                 WHERE `plings`.`status_id` = 2
1051                   AND `project`.`status` = :project_status
1052                   AND `project`.`type_id` = 1
1053                   AND `project`.`member_id` = :member_id
1054             ';
1055         $result =
1056             $this->_db->fetchAll($sql,
1057                 array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE));
1058 
1059         return count($result);
1060     }
1061 
1062     public function fetchSupporterDonationInfo($member_id)
1063     {
1064         /*$sql = 'SELECT max(active_time) AS active_time_max
1065                             ,min(active_time)  AS active_time_min
1066                             ,(DATE_ADD(max(active_time), INTERVAL 1 YEAR) > now()) AS issupporter
1067                             ,count(1)  AS cnt from support  where status_id = 2 AND type_id = 0 AND member_id = :member_id ';*/
1068         $sql = "
1069                 select 
1070                 member_id,
1071                 max(valid_till) as active_time_max,
1072                 min(active_time_min) as active_time_min,
1073                 max(is_valid) as issupporter,
1074                 count(1) AS cnt
1075                 from v_support
1076                 where member_id = :member_id
1077         ";
1078         $result = $this->getAdapter()->fetchRow($sql, array('member_id' => $member_id));
1079 
1080         return $result;
1081     }
1082 
1083     public function fetchSupporterSubscriptionInfo($member_id)
1084     {
1085         $sql = 'SELECT create_time,amount,period,period_frequency from support  where status_id = 2 AND type_id = 1 
1086                 AND member_id = :member_id
1087                 ORDER BY create_time desc
1088                 LIMIT 1';
1089         $result = $this->getAdapter()->fetchRow($sql, array('member_id' => $member_id));
1090 
1091         return $result;
1092     }
1093 
1094     public function fetchSupporterSectionNr($member_id)
1095     {
1096         $sql ="select count(distinct c.name) sections from 
1097                 section_support s, support t , section c
1098                 where s.support_id = t.id and s.section_id = c.section_id
1099                 and  t.member_id = :member_id and t.status_id>=2
1100                 and s.is_active = 1
1101             ";
1102         $result = $this->getAdapter()->fetchRow($sql, array('member_id' => $member_id));        
1103         return $result['sections'];
1104 
1105     }
1106     public function fetchSupporterSectionInfo($member_id)
1107     {
1108         $sql = "select GROUP_CONCAT(distinct c.name) sections from 
1109                 section_support s, support t , section c
1110                 where s.support_id = t.id and s.section_id = c.section_id
1111                 and  t.member_id = :member_id and t.status_id>=2
1112                 and s.is_active = 1
1113                 order by c.order";
1114         $result = $this->getAdapter()->fetchRow($sql, array('member_id' => $member_id));        
1115         return $result;
1116     }
1117 
1118     public function fetchLastActiveTime($member_id)
1119     {
1120         $sql_page_views =
1121             "SELECT `created_at` AS `lastactive` FROM `stat_page_views` WHERE `member_id` = :member_id ORDER BY `created_at` DESC LIMIT 1";
1122         $sql_activities = "SELECT `time` AS lastactive FROM activity_log WHERE member_id = :member_id ORDER BY `time` DESC LIMIT 1";
1123 
1124         $result_page_views = $this->getAdapter()->fetchRow($sql_page_views, array('member_id' => $member_id));
1125         $result_activities = $this->getAdapter()->fetchRow($sql_activities, array('member_id' => $member_id));
1126 
1127         if (count($result_page_views) > 0 AND count($result_activities) > 0) {
1128             return $result_page_views['lastactive'] > $result_activities['lastactive'] ? $result_page_views['lastactive']
1129                 : $result_activities['lastactive'];
1130         }
1131         if (count($result_page_views) > count($result_activities)) {
1132             return $result_page_views['lastactive'];
1133         }
1134         if (count($result_activities) > count($result_page_views)) {
1135             return $result_activities['lastactive'];
1136         }
1137 
1138         return null;
1139     }
1140 
1141     /**
1142      * @param int $member_id
1143      *
1144      * @return array
1145      */
1146     public function fetchContributedProjectsByCat($member_id)
1147     {
1148         $projects = $this->fetchSupportedProjects($member_id);
1149         $catArray = array();
1150         if (count($projects) == 0) {
1151             return $catArray;
1152         }
1153 
1154         foreach ($projects as $pro) {
1155             $catArray[$pro->catTitle] = array();
1156         }
1157 
1158         $helperProductUrl = new Default_View_Helper_BuildProductUrl();
1159         foreach ($projects as $pro) {
1160             $projArr = array();
1161             $projArr['id'] = $pro->project_id;
1162             $projArr['name'] = $pro->title;
1163             $projArr['image'] = $pro->image_small;
1164             $projArr['url'] = $helperProductUrl->buildProductUrl($pro->project_id, '', null, true);
1165             $projArr['sumAmount'] = $pro->sumAmount;
1166             array_push($catArray[$pro->catTitle], $projArr);
1167         }
1168 
1169         return $catArray;
1170     }
1171 
1172     /**
1173      * @param int  $member_id
1174      * @param null $limit
1175      *
1176      * @return Zend_Db_Table_Rowset_Abstract
1177      */
1178     public function fetchSupportedProjects($member_id, $limit = null)
1179     {
1180         $sql = "
1181                 SELECT plings.project_id,                       
1182                        project.title,
1183                        project.image_small,                       
1184                        project_category.title AS catTitle,                       
1185                        (SELECT SUM(amount) FROM plings WHERE plings.project_id=project.project_id AND plings.status_id=2) AS sumAmount
1186                 FROM plings
1187                  JOIN project ON plings.project_id = project.project_id
1188                  JOIN project_category ON project.project_category_id = project_category.project_category_id                 
1189                 WHERE plings.status_id IN (2,3,4)
1190                   AND plings.member_id = :member_id
1191                   AND project.status = :project_status
1192                   AND project.type_id = 1
1193                 GROUP BY plings.project_id
1194                 ORDER BY sumAmount DESC
1195                 ";
1196 
1197         if (null != $limit) {
1198             $sql .= $this->_db->quoteInto(" limit ?", $limit, 'INTEGER');
1199         }
1200 
1201         $result =
1202             $this->_db->fetchAll($sql,
1203                 array('member_id' => $member_id, 'project_status' => Default_Model_Project::PROJECT_ACTIVE));
1204 
1205         return $this->generateRowSet($result);
1206     }
1207 
1208     /**
1209      * @param string $value
1210      * @param int    $test_case_sensitive
1211      * @param array  $omitMember
1212      * @param bool   $onlyActive
1213      *
1214      * @return array return an array of rows
1215      */
1216     public function findUsername($value, $test_case_sensitive = self::CASE_INSENSITIVE, $omitMember = array(), $onlyActive = false)
1217     {
1218         $sql = "
1219             SELECT *
1220             FROM `member`
1221         ";
1222         if ($test_case_sensitive == self::CASE_INSENSITIVE) {
1223             $sql .= "WHERE LCASE(member.username) = LCASE(:username)";
1224         } else {
1225             $sql .= "WHERE member.username = :username";
1226         }
1227 
1228         if (count($omitMember) > 0) {
1229             $sql .= " AND member.member_id NOT IN (" . implode(',', $omitMember) . ")";
1230         }
1231 
1232         if ($onlyActive) {
1233             $sql .= " AND member.is_active = 1 and member.is_deleted = 0";
1234         }
1235 
1236         return $this->_db->fetchAll($sql, array('username' => $value));
1237     }
1238 
1239     /**
1240      * @param string $login
1241      *
1242      * @return int
1243      */
1244     public function generateUniqueUsername($login)
1245     {
1246         $sql = "SELECT COUNT(*) AS `counter` FROM `member` WHERE `username` REGEXP CONCAT(:user_name,'[_0-9]*$')";
1247         $result = $this->_db->fetchRow($sql, array('user_name' => $login));
1248 
1249         return $login . '_' . $result['counter'];
1250     }
1251 
1252     /**
1253      * @param int    $member_id
1254      * @param string $email
1255      *
1256      * @return bool
1257      * @throws Zend_Db_Statement_Exception
1258      */
1259     public function setActive($member_id, $email)
1260     {
1261         $sql = "
1262             UPDATE `member`
1263               STRAIGHT_JOIN `member_email` ON `member`.`member_id` = `member_email`.`email_member_id` AND `member_email`.`email_checked` IS NULL AND `member`.`is_deleted` = 0 AND `member_email`.`email_deleted` = 0
1264             SET `member`.`mail_checked` = 1, `member`.`is_active` = 1, `member`.`changed_at` = NOW(), `member_email`.`email_checked` = NOW()
1265             WHERE `member`.`member_id` = :memberId AND `member_email`.`email_address` = :mailAddress;
1266         ";
1267         $stmnt = $this->_db->query($sql, array('memberId' => $member_id, 'mailAddress' => $email));
1268 
1269         return $stmnt->rowCount() > 0 ? true : false;
1270     }
1271 
1272     /**
1273      * @param string $identity
1274      *
1275      * @return Zend_Db_Table_Row_Abstract
1276      */
1277     public function findActiveMemberByMail($identity)
1278     {
1279         $sqlMail = "
1280                     SELECT `m`.*, `me`.`email_address` AS `mail`, IF(ISNULL(`me`.`email_checked`),0,1) AS `mail_checked`
1281                     FROM `member` AS `m`
1282                     JOIN `member_email` AS `me` ON `me`.`email_member_id` = `m`.`member_id` AND `me`.`email_primary` = 1
1283                     WHERE `is_active` = :active AND `is_deleted` = :deleted AND `me`.`email_address` = :identity
1284         ";
1285 
1286         // test identity as mail
1287         $resultMail = $this->getAdapter()->fetchRow($sqlMail,
1288             array('active' => self::MEMBER_ACTIVE, 'deleted' => self::MEMBER_NOT_DELETED, 'identity' => $identity));
1289         if ((false !== $resultMail) AND (count($resultMail) > 0)) {
1290             return $this->generateRowClass($resultMail);
1291         }
1292 
1293         return $this->createRow();
1294     }
1295 
1296     public function getMembersAvatarOldAutogenerated($orderby = 'member_id desc', $limit = null, $offset = null)
1297     {
1298         $sql = "
1299                      SELECT * FROM `tmp_member_avatar_unknow` 
1300              ";
1301 
1302 
1303         if (isset($orderby)) {
1304             $sql = $sql . '  order by ' . $orderby;
1305         }
1306 
1307         if (isset($limit)) {
1308             $sql .= ' limit ' . (int)$limit;
1309         }
1310 
1311         if (isset($offset)) {
1312             $sql .= ' offset ' . (int)$offset;
1313         }
1314 
1315         $resultSet = $this->_db->fetchAll($sql);
1316 
1317         return $resultSet;
1318     }
1319 
1320     public function getMembersAvatarOldAutogeneratedTotalCount()
1321     {
1322         $sql = " 
1323                       select count(1) as cnt
1324                       from tmp_member_avatar_unknow 
1325         ";
1326         $result = $this->getAdapter()->query($sql, array())->fetchAll();
1327 
1328         return $result[0]['cnt'];
1329     }
1330 
1331     public function updateAvatarTypeId($member_id, $type_id)
1332     {
1333         $sql = "
1334                       update member set avatar_type_id = :type_id where member_id = :member_id
1335                    ";
1336         $this->getAdapter()->query($sql, array('type_id' => $type_id, 'member_id' => $member_id));
1337     }
1338 
1339     /**
1340      * @param $userData
1341      * @param $uuidMember
1342      *
1343      * @return string
1344      * @throws Exception
1345      */
1346     protected function generateIdentIcon_old($userData, $uuidMember)
1347     {
1348         $identIcon = new Local_Tools_Identicon();
1349         $tmpImagePath = IMAGES_UPLOAD_PATH . 'tmp/' . $uuidMember . '.png';
1350         imagepng($identIcon->renderIdentIcon(sha1($userData['mail']), 1100), $tmpImagePath);
1351 
1352         $imageService = new Default_Model_DbTable_Image();
1353         $imageFilename = $imageService->saveImageOnMediaServer($tmpImagePath);
1354 
1355         return $imageFilename;
1356     }
1357 
1358     /**
1359      * @param int $member_id
1360      *
1361      * @throws Exception
1362      * @deprecated since we're using solr server for searching
1363      */
1364     private function removeMemberProjectsFromSearch($member_id)
1365     {
1366         $modelProject = new Default_Model_Project();
1367         $memberProjects = $modelProject->fetchAllProjectsForMember($member_id);
1368         $modelSearch = new Default_Model_Search_Lucene();
1369         foreach ($memberProjects as $memberProject) {
1370             $product = array();
1371             $product['project_id'] = $memberProject->project_id;
1372             $product['project_category_id'] = $memberProject->project_category_id;
1373             $modelSearch->deleteDocument($product);
1374         }
1375     }
1376 
1377     public static function cleanAuthMemberForJson(array $authMember)
1378     {
1379         if (empty($authMember)) {
1380             return $authMember;
1381         }
1382 
1383         $unwantedKeys = array(
1384             'mail' => 0,
1385             'firstname' => 0,
1386             'lastname' => 0,
1387             'street' => 0,
1388             'zip' => 0,
1389             'phone' => 0,
1390             'paypal_mail' => 0,
1391             'gravatar_email' => 0,
1392             'source_pk' => 0,
1393             'source_id' => 0,
1394             'password_old' => 0,
1395             'password_type_old' => 0,
1396             'username_old' => 0,
1397             'mail_old' => 0
1398         );
1399 
1400         $authMember = array_diff_key($authMember, $unwantedKeys);
1401 
1402         return $authMember;
1403     }
1404 }