Your IP : 216.73.217.79


Current Path : /var/www/v3.cesa.co.za/src/UserBundle/Repository/
Upload File :
Current File : /var/www/v3.cesa.co.za/src/UserBundle/Repository/UserListRepository.php

<?php

namespace App\UserBundle\Repository;

use Doctrine\ORM\EntityRepository;
use App\SessionsBundle\Entity\Sites;
use App\UserBundle\Entity\UserList;

/**
 * UserListRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class UserListRepository extends EntityRepository {

    /**
     * Check if another user with the same user name exists
     *
     * @param  string $userListId
     * @param  string $username
     * @return boolean
     */
    public function checkOtherUserExists($userListId, $username) {

        $qb = $this->createQueryBuilder('ul')
                ->where('ul.username = :username')
                ->setParameter('username', $username);

        if ((strlen($userListId) > 0) || ($userListId > 0))
            $qb->andWhere('ul.id != :id')
                    ->setParameter('id', $userListId);

        $query = $qb->getQuery();

        $userList = $query->execute();

        if (count($userList) > 0)
            return true;
        else
            return false;
    }

    /**
     * Get all Users who have access levels
     *
     * @return array
     */
    public function findByAccessLevels($accessLevels, $conf = array()) {

        $qb = $this->createQueryBuilder('ul')
                        ->join('ul.access_level', 'al')
                        ->where('al.id IN (:accessLevels)')->setParameter('accessLevels', $accessLevels);

        if (isset($conf['company']) && is_object($conf['company'])) {
            $qb->andWhere('ul.companies = :company')->setParameter('company', $conf['company']);
        }

//        var_dump($accessLevels);
//        echo $qb->getQuery()->getSQL();
//        exit;

        return $qb->getQuery()->execute();
    }

    /**
     * Check if another user with the same user name exists
     *
     * @param  array $fields
     * @return UserList
     */
    public function findOneByEMailAddress($fields) {

        $qb = $this->createQueryBuilder('ul')
                ->where('ul.e_mail_address_string = :e_mail_address')
                ->setParameter('e_mail_address', $fields['e_mail_address']);

        $qb->addGroupBy('ul.id');
        $qb->setMaxResults(1);

        $query = $qb->getQuery();

        return $query->getOneOrNullResult();
    }

    /**
     * Get all Users by search text and/ or company name
     *
     * @param string $searchText
     * @param string $companyId
     * @param array $conf
     * @return array
     */
    public function findBySearchCompany($searchText, $companyId, $conf = array()) {

        $qb = $this->createQueryBuilder('ul')
                ->where('1 = 1');

        if ($searchText != '') {
            $qb->where('ul.first_name_string LIKE :searchText OR ul.last_name_string LIKE :searchText OR ul.username LIKE :searchText OR ul.id_number LIKE :searchText')
                    ->setParameter('searchText', '%' . $searchText . '%');
        }

        if (strlen($companyId) > 0 && $companyId != '0') {
            $qb->join('ul.companies', 'co')
                    ->andWhere('co.id = :companyId')
                    ->setParameter('companyId', $companyId);
        }

        if (isset($conf['mobile']) && $conf['mobile']) {
            $qb->join('ul.user_tel_no_mobile', 'ulm')
                    ->andWhere('ulm.tel_fax_number <> :telNum')->setParameter('telNum', '');
        } elseif (isset($conf['e_mail']) && $conf['e_mail']) {
            $qb->join('ul.user_e_mail_address', 'uem')
                    ->andWhere('uem.e_mail_address <> :eMail')->setParameter('eMail', '')
                    ->andWhere('uem.e_mail_address LIKE :atSign')->setParameter('atSign', '%@%');
        }

        if (isset($conf['user_type_id']) && strlen($conf['user_type_id']) > 0) {
            $qb->join('ul.user_types', 'ut')
                    ->andWhere('ut.id = :userTypeId')->setParameter('userTypeId', $conf['user_type_id']);
        }

        $query = $qb->getQuery();

//        echo $query->getSQL() . ' - ' . $companyId . '<br /><br />';

        return $query->execute();
    }

    /**
     * Get all Users who receive admin notifications
     *
     * @return array
     */
    public function findAdminNotificationRecipients($adminUserTypeId) {

        $qb = $this->createQueryBuilder('ul')
                        ->join('ul.user_types', 'ut')
                        ->join('ul.user_e_mail_address', 'uem')
                        ->where('uem.e_mail_address IS NOT NULL')
                        ->andWhere('uem.subscribed = 1')
                        ->andWhere('ut.id = :userTypeId')->setParameter('userTypeId', $adminUserTypeId);

        return $qb->getQuery()->execute();
    }

    /**
     * Get all Users by search text and/ or company name
     *
     * @param array $params
     * @return array
     */
    public function getListQuery($params) {

        $qb = $this->createQueryBuilder('ul')
                ->where('1 = 1');

        if (isset($params['contacts']) && $params['contacts']) {

            $params['contacts'] = false;
            $params['return_ids'] = true;
            $params['userTypeId'] = null;
            $params['userTypeIds'] = null;

            $oldSearchText = $params['searchText'];
            $params['searchText'] = null;

            $userListIDs = $this->getListQuery($params)->execute();
            $createdByIds = array();

            foreach ($userListIDs as $userListID) {
//                echo $userListID['id'] . " ID found<br>\r\n";
                $createdByIds[] = $userListID['id'];
            }
//            echo $params['refer'];
//            var_dump(array_keys($params));
//            exit;

            $qb->join('ul.user_contact', 'uc')
                    ->andWhere('uc.created_by IN (:createdBy)')->setParameter('createdBy', $createdByIds);

            $params['companyId'] = null;
            $params['return_ids'] = false;
            $params['searchText'] = $oldSearchText;
        } elseif ((isset($params['companyId']) && strlen($params['companyId']) > 0 && $params['companyId'] != '0') && (isset($params['userList']) && is_object($params['userList']))) {
            $qb->join('ul.companies', 'co')
                    ->join('co.company_agents', 'ca');
        } elseif (isset($params['companyId']) && strlen($params['companyId']) > 0 && $params['companyId'] != '0') {
            $qb->join('ul.companies', 'co');
        }

//        echo $params['companyId'];
//        exit;

        if (isset($params['companyId']) && strlen($params['companyId']) > 0 && $params['companyId'] != '0' && $params['companyId'] != '-') {
            $qb->andWhere('co.id = :companyId OR co.parent_id = :companyId')
                    ->setParameter('companyId', $params['companyId']);
        }

        if (isset($params['userList']) && is_object($params['userList'])) {

            if ($params['userList']->getGranted('ROLE_COMPANY_ADMINISTRATOR')) {
                $companies = $params['userList']->getCompanies();
                $sendParams = $params;

                unset($sendParams['userList']);

                $params['limit_user_ids'][] = array($params['userList']->getId());
                $sendParams['return_ids'] = true;

                foreach ($companies as $company) {
                    $sendParams['companyId'] = $company->getId();

                    $userIds = array();

                    foreach ($this->getListQuery($sendParams)->execute() as $oneUser) {
                        $userIds[] = $oneUser['id'];
                    }
//                    echo count($params['limit_user_ids']) . ' - ' . count($userIds) . ' - ' . count(array_merge($params['limit_user_ids'], $userIds)) . '<br />';
                    $params['limit_user_ids'] = array_merge($params['limit_user_ids'], $userIds);
                } //foreach
            } else {
                $qb->andWhere('ul.id = :userListId')
                        ->setParameter('userListId', $params['userList']->getId());
            }
        }

        if (isset($params['userTypeIds']) && is_array($params['userTypeIds']) > 0 && count($params['userTypeIds']) > 0) {
            $qb->join('ul.user_types', 'ut')
                    ->andWhere('ut.id IN (:userTypeIds)')
                    ->setParameter('userTypeIds', $params['userTypeIds']);
        } elseif (isset($params['userTypeId']) && strlen($params['userTypeId']) > 0 && $params['userTypeId'] != '0') {
            $qb->join('ul.user_types', 'ut')
                    ->andWhere('ut.id = :userTypeId')
                    ->setParameter('userTypeId', $params['userTypeId']);
        }

        if (isset($params['group_ids']) && count($params['group_ids']) > 0) {
            $qb->join('ul.user_group', 'ug')
                    ->andWhere('ug.id IN (:userGroupIds)')
                    ->setParameter('userGroupIds', $params['group_ids']);
        }

        if (isset($params['limit_user_ids']) && count($params['limit_user_ids'])) {
            $qb->andWhere('ul.id IN (:limitUserIds)')
                    ->setParameter('limitUserIds', $params['limit_user_ids']);
        }

        if (isset($params['referredByUser']) && is_object($params['referredByUser'])) {
            $qb->andWhere('ul.referred_by = :referredByUser')
                    ->setParameter('referredByUser', $params['referredByUser']->getId());
        }

        if (isset($params['e_mail_only']) && $params['e_mail_only']) {
            $qb->join('ul.user_e_mail_address', 'uema');
        }

        if (isset($params['e_mail_subscribed_only']) && $params['e_mail_subscribed_only']) {
            $qb->andWhere('uema.subscribed = :subscribed')
                    ->setParameter('subscribed', true);
        }

        if (isset($params['sms_only']) && $params['sms_only']) {
            $qb->join('ul.user_tel_no_mobile', 'utnm');
        }

        if (isset($params['sms_subscribed_only']) && $params['sms_subscribed_only']) {
            $qb->andWhere('utnm.opted_in = :subscribed')
                    ->setParameter('subscribed', true);
        }

        if (isset($params['searchText']) && strlen($params['searchText']) > 0) {
            $qb->andWhere('ul.first_name_string LIKE :searchText OR ul.last_name_string LIKE :searchText OR ul.username LIKE :searchText')
                    ->setParameter('searchText', '%' . $params['searchText'] . '%');
        }

        if (isset($params['accessLevel']) && is_object($params['accessLevel'])) {
            $qb->join('ul.access_level', 'al')
                    ->andWhere('al.id = :accessLevel')
                    ->setParameter('accessLevel', $params['accessLevel']->getId());
        }

//        echo $qb->getQuery()->getSQL() . "\r\n <br /><br />";
//        echo 'referredByUser: ' . $params['referredByUser'] . "\r\n";
//        echo 'group_ids: ' . $params['group_ids'] . "\r\n";
//        echo 'userTypeId: ' . $params['userTypeId'] . "\r\n";
//        echo 'companyId: ' . $params['companyId'] . "\r\n<br />";
//        exit;

        if (isset($params['return_ids']) && $params['return_ids']) {
            return $qb->select('ul.id')->getQuery();
        }

        $qb->orderBy('ul.last_name_string', 'ASC')
                ->addOrderBy('ul.first_name_string', 'ASC');

        return $qb->getQuery();
    }

    /**
     * Get the users for a given site
     *
     * @param Sites $site
     * @param integer $limit
     */
    public function getArray(Sites $site, $limit = 0) {
        $qb = $this->createQueryBuilder('ul')
                        ->select('ul.id')
                        ->where('ul.site = :site')->setParameter('site', $site);

        if ($limit > 0) {
            $qb->setMaxResults($limit);
        }

        return $qb->getQuery()
                        ->getArrayResult()
        ;
    }

    /**
     * Find newly referred users
     *
     * @return array
     */
    public function findNewReferredUsers() {

        $nots = $this->createQueryBuilder('ul')
                ->select('un.user_referred_id')
                ->innerJoin('UserBundle:UserNetwork', 'un')
                ->where('ul.id = un.user_referred_id')
                ->andWhere('un.credits_allocated = 1')
                ->getQuery()
                ->getArrayResult();

        $qb = $this->createQueryBuilder('ul')
                ->where('ul.referred_by IS NOT NULL');

        if (count($nots) > 0) {
            $qb = $qb->andWhere('ul.id NOT IN (:referredIds)')->setParameter('referredIds', array_values($nots));
        }


        return $qb->getQuery()->getResult();
    }

    /**
     * Get user linked company IDs
     *
     * @return array()
     */
    public function getCompanyIds(UserList $userList) {

        $qb = $this->createQueryBuilder('ul')
                        ->join('ul.companies', 'co')
                        ->where('ul.id = :userListId')->setParameter('userListId', $userList->getId());

        return $qb->select('co.id')->getQuery()->setHydrationMode(\Doctrine\ORM\Query::HYDRATE_ARRAY)->getArrayResult();
    }

    /**
     * Get all Users linked to a travel establishment
     *
     * @return array
     */
    public function findAllEstablishmentOwners() {

        $qb = $this->createQueryBuilder('ul')
                ->join('ul.companies', 'co')
                ->join('co.establishments', 'est');

        $query = $qb->getQuery();

//        echo $query->getSQL() . ' - ' . $companyId . '<br /><br />';

        return $query->execute();
    }
}