Your IP : 216.73.217.79


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

<?php

namespace App\UserBundle\Services;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\PasswordHasher\Hasher\PasswordHasherFactory;
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasher;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
use Monolog\Logger;
use App\ContactBundle\Entity\ContactMethod;
use App\ContactBundle\Entity\ContactReason;
use App\ContactBundle\Entity\MessageType;
use App\CoreBundle\Services\Openssl_EncryptDecrypt;
use App\CoreBundle\Services\Utils;
use App\SessionsBundle\Entity\Sites;
use App\UserBundle\Entity\UserBankDetail;
use App\UserBundle\Entity\UserList;
use App\UserBundle\Entity\UserTelNo;
use App\UserBundle\Entity\UserAddress;
use App\UserBundle\Entity\UserEMailAddress;

/**
 * User List manager
 *
 * @author Otto Saayman <otto@igotafrica.com>
 * @package UserBundle
 * @subpackage UserList
 * @version 0.0.1
 */
final class UserListManager
{

    /**
     * Service Container
     * @var object
     */
    private $container = null;

    /**
     * Entity manager
     * @var object
     */
    private $em;

    /**
     * Security Context
     * @var \Symfony\Component\Security\Core\SecurityContextInterface
     */
    protected $securityContext;

    /**
     * Class construct
     *
     * @param  ContainerInterface $container
     * @param  Logger             $logger
     * @return void
     */
    public function __construct(
        ContainerInterface $container
    ) {
        $this->setContainer($container);
        $this->setEm($container->get('doctrine')->getManager('default'));

        return;
    }

    /**
     * Get Container
     *
     * @return ContainerInterface $container
     */
    public function getContainer()
    {
        return $this->container;
    }

    /**
     * Set Container
     *
     * @param  ContainerInterface $container
     * @return void
     */
    public function setContainer($container)
    {
        $this->container = $container;
    }

    public function setSecurityContext(UsageTrackingTokenStorage $securityContext)
    {
        $this->securityContext = $securityContext;
    }

    /**
     * Get Entity Manager
     *
     * @return string
     */
    public function getEm()
    {
        return $this->em;
    }

    /**
     * Set Container
     *
     * @param  string $em
     * @return void
     */
    public function setEm($em)
    {
        $this->em = $em;
    }

    /**
     * Get a User
     *
     * @return UserList
     */
    public function find($id)
    {

        if (strlen($id) <= 0) {
            return null;
        }

        return $this->em->getRepository(UserList::class)->find($id);
    }

    /**
     * Get a User by parameters
     *
     * @param array $params
     * @return UserList
     */
    public function findOneBy($params)
    {
        return $this->em->getRepository(UserList::class)->findOneBy($params);
    }

    /**
     * Get a User by parameters
     *
     * @param array $params
     * @return array
     */
    public function findBy($params)
    {
        return $this->em->getRepository(UserList::class)->findBy($params);
    }

    /**
     * Get all Users
     *
     * @return array
     */
    public function findAll()
    {
        return $this->em->getRepository(UserList::class)->findAll();
    }

    /**
     * Save a User
     *
     * @params UserList $userList
     * @return UserList
     */
    public function save(UserList &$userList)
    {

        $this->em->persist($userList);
        $this->em->flush();

        return $userList;
    }

    /**
     * Remove a User List
     *
     * @param string $userListId
     * @param UserList $owner
     */
    public function removeById($userListId, UserList $owner, Companies $company = null)
    {

        $userList = $this->find($userListId);

        if (!is_object($userList)) {
            return;
        }

        if ($this->canEdit($userList, $owner)) {
            $this->getEm()->remove($userList);
            $this->getEm()->flush();
        } else {
            $this->getContainer()->get('user_contact.manager')->unLinkUser($userList, $owner, $company);
        }
    }

    /**
     * Get all Users by company
     *
     * @param string $companyId
     * @return array
     */
    public function getAllQuery($params = array())
    {

        if (!isset($params['referredByUser'])) {
            $params['referredByUser'] = null;
        }

        if (!isset($params['return_ids'])) {
            $params['return_ids'] = false;
        }

        if (!isset($params['userList'])) {
            $params['userList'] = null;
        }

        if (!isset($params['refer'])) {
            $params['refer'] = true;
        }

        if (!isset($params['contacts'])) {
            $params['contacts'] = false;
        }

        if (!is_object($params['referredByUser']) && !$params['return_ids'] && $params['refer']) {
            $params['userList'] = $this->getLoggedInUser();
        }

        if (!is_object($params['referredByUser']) && is_object($params['userList']) && $params['userList']->getGranted('ROLE_SUPER_ADMINISTRATOR')) {
            $params['userList'] = null;
        }

        if (isset($params['userTypeId']) && strpos($params['userTypeId'], ',') > 0) {
            $params['userTypeIds'] = explode(',', $params['userTypeId']);
        }

        return $this->em->getRepository(UserList::class)->getListQuery($params);
    }

    /**
     * Get a User by access levels
     *
     * @param array $accessLevels
     * @return array
     */
    public function findByAccessLevels($accessLevels, $conf = array())
    {
        return $this->em->getRepository(UserList::class)->findByAccessLevels($accessLevels, $conf);
    }

    /**
     * Get all Users by search text and/ or company name
     *
     * @param string $eMailAddress
     * @return UserList
     */
    public function findOneByEMailAddress($eMailAddress)
    {
        return $this->em->getRepository(UserList::class)->findOneByEMailAddress(array('e_mail_address' => $eMailAddress));
    }

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

        $userLists = $this->em->getRepository(UserList::class)->findBySearchCompany($searchText, $companyId);
        $return = array();

        foreach ($userLists as $userList) {
            $return[] = array('id' => $userList->getId(), 'text' => $userList->getFullNameString() . ' (' . $userList->getUsername() . ')');
        }

        return $return;
    }

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

        $userLists = $this->em->getRepository(UserList::class)->findBySearchCompany($searchText, $companyId, $conf);
        $return = array();

        foreach ($userLists as $userList) {

            $userName = $userList->getUsername();

            if (isset($conf['mobile']) && $conf['mobile']) {
                $userName = $userList->getUserTelNoMobileString();
            }

            $return[$userList->getFullNameString() . ' (' . $userName . ')'] = $userList->getId();
        }

        return $return;
    }

    /**
     * Move user to a company
     *
     * @param  UserList $userList
     * @param  string $companyId
     * @return void
     */
    public function moveCompany(UserList $userList, $companyId, Companies $oldCompany = null)
    {

        $companyManager = $this->getContainer()->get('companies.manager');

        $company = $companyManager->find($companyId);

        if (!is_object($company)) {
            return;
        }

        $companyManager->moveUser($company, $userList, $oldCompany);
    }

    /**
     * Move user to a company
     *
     * @param  UserList $userList
     * @param  string $companyIds
     * @return void
     */
    public function linkCompanies(UserList $userList, $companyIds)
    {

        if (!is_array($companyIds)) {
            $companyIds = explode(',', $companyIds);
        }

        $companyManager = $this->getContainer()->get('companies.manager');

        $companies = $userList->getCompanies();
        $linkedCompanyIds = array();

        foreach ($companies as $linkedCompany) {
            if (!in_array($linkedCompany->getId(), $companyIds)) {
                //                echo 'unlinking ' . $linkedCompany->getName();
                //                exit;
                $companyManager->unlinkUser($linkedCompany, $userList);
            } else {
                $linkedCompanyIds[] = $linkedCompany->getId();
            }
        } //foreach linked company

        foreach ($companyIds as $companyId) {
            if (!in_array($companyId, $linkedCompanyIds)) {
                $company = $companyManager->find($companyId);
                //                echo 'linking ' . $company->getName();
                //                exit;
                if (is_object($company)) {
                    $companyManager->linkUser($company, $userList);
                }
            }
        }
    }

    /**
     * Get all Users who receive admin notifications
     *
     * @return array
     */
    public function findAdminNotificationRecipients()
    {
        return $this->em->getRepository(UserList::class)
            ->findAdminNotificationRecipients($this->getContainer()->get('system_setting.manager')->getSetting('admin_user_type'));
    }

    /**
     * Get a UserList object as an array
     *
     * @param string $userListId
     * @return array
     */
    public function getUserListObjectArray($userListId)
    {

        $return = array('user_list' => array(), 'error_message' => '');

        if (strlen($userListId) <= 0) {
            $userListId = '0';
        }

        $userList = $this->find($userListId);

        if (!is_object($userList)) {
            $return['error_message'] = 'That user does not exist';
            return $return;
        }

        $return['user_list'] = array(
            'id' => $userList->getId(),
            'first_name_string' => trim($userList->getFirstNameString()),
            'last_name_string' => trim($userList->getLastNameString()),
            'e_mail_address' => trim($userList->getEMailAddressString()),
            'mobile_number' => trim($userList->getUserTelNoMobileString()),
            'id_number' => trim($userList->getIdNUmber()),
        );

        return $return;
    }

    /**
     * Get a UserList object as an array
     *
     * @param string $userListId
     * @return array
     */
    public function getSelectArray($accessLevelId = '-', $params = array())
    {

        $return = array();

        foreach ($this->getAllQuery($params)->execute() as $user) {
            $return[$user->getFullNameString() . ' (' . $user->getUsername() . ')'] = $user->getId();
        }
        return $return;
    }

    /**
     * Update password
     *
     * @param  UserList $userList
     * @return void
     */
    public function updatePassword(UserList $userList)
    {
        //Check and encrypt the password

        if (strlen($userList->getPassword()) <= 0 && strlen($userList->getPlainPassword()) <= 0) {
            $userList->setPlainPassword(microtime());
        }

        if (strlen($userList->getPlainPassword()) > 0) {

            $passwordHasherFactory = new PasswordHasherFactory([
                // auto hasher with default options for the User class (and children)
                User::class => ['algorithm' => 'auto'],
                // auto hasher with custom options for all PasswordAuthenticatedUserInterface instances
                PasswordAuthenticatedUserInterface::class => [
                    'algorithm' => 'auto',
                    'cost' => 15,
                ],
            ]);

            $passwordHasher = new UserPasswordHasher($passwordHasherFactory);

            // hash the password (based on the password hasher factory config for the $user class)
            $hashedPassword = $passwordHasher->hashPassword(
                $userList,
                $userList->getPlainPassword()
            );
            $userList->setPassword($hashedPassword);

            //            $factory = $this->getContainer()->get('security.encoder_factory');
            //            $encoder = $factory->getEncoder($userList);
            //            $userList->setSalt(microtime());
            //            $encodedPassword = $encoder->encodePassword($userList->getPlainPassword(), $userList->getSalt());
            //
            //            $userList->setPassword($encodedPassword);

            $this->checkRequestValues($userList);
            $this->save($userList);
        }
    }

    /**
     * Set user type to admin
     *
     * @param  UserList $userList
     * @return void
     */
    public function setAdminUserTypeId(UserList &$userList)
    {
        $userTypesManager = $this->getContainer()->get('user_types.manager');
        $adminUserType = $userTypesManager->getAdminUserTypeId();

        $userList->setUserTypes($adminUserType);
    }

    /**
     * Set user type to frontend
     *
     * @param  UserList $userList
     * @return void
     */
    public function setFrontendUserTypeId(UserList &$userList)
    {
        $userTypesManager = $this->getContainer()->get('user_types.manager');
        $frontendUserType = $userTypesManager->getFrontendUserTypeId();

        $userList->setUserTypes($frontendUserType);
    }

    /**
     * Get logged in user
     *
     * @return UserBundle:UserList
     */
    public function getLoggedInUser($session = null)
    {

        $user = null;

        //        echo $this->securityContext->getToken();

        if (!is_object($this->securityContext)) {
            return null;
        }

        if (is_object($this->securityContext->getToken()) && is_object($this->securityContext->getToken()->getUser())) {
            //            echo 'got user from context <br /> ';
            //            exit;
            $user = $this->securityContext->getToken()->getUser();
        }

        if (is_object($this->securityContext->getToken()) && !is_object($user)) {
            //            echo 'got user from db by username <br /> ';
            //            exit;
            $user = $this->findOneBy(array('username' => $this->securityContext->getToken()->getUser()));
        }

        if (!is_object($user) && !is_object($session)) {
            $session = $this->container->get('sessions.manager')->getSession();
        }

        if (
            !is_object($user) && is_object($session) && is_object($this->getContainer()->get('sessions.manager')->getSfSession()) &&
            !$this->getContainer()->get('sessions.manager')->getSfSession()->get('logout') &&
            $this->getContainer()->get('session_values.manager')->getValue(array('value_name' => 'logged_on_user_id', 'session' => $session)) != '-'
        ) {
            //            echo $this->getContainer()->get('session_values.manager')->getValue(array('value_name' => 'logged_on_user_id', 'session' => $session))
            //            . ' - ' . $session->getId() . ' got user from session stored id <br /> ';
            //            exit;
            $user = $this->find($this->getContainer()->get('session_values.manager')->getValue(array('value_name' => 'logged_on_user_id', 'session' => $session)));
        }

        //        if (!is_object($this->securityContext->getToken()) && is_object($user) && is_object($this->container->get('sessions.manager')->getRequest())) {
        //            echo 'Must do login!';
        //            exit;
        //            $request = $this->container->get('sessions.manager')->getRequest();
        //            $this->doLogin($request, $user, true);
        //        }
        //        echo 'Logged in';
        //        echo $this->securityContext->getToken();
        //        exit;

        if (is_object($this->securityContext->getToken()) && !is_object($this->securityContext->getToken()->getUser()) && is_object($user)) {
            //            echo 'Setting user ';
            //            exit;
            $this->securityContext->getToken()->setUser($user);
        }

        if (is_object($user) && is_object($session)) {
            $this->getContainer()->get('session_values.manager')->setValue(array('value_name' => 'logged_on_user_id', 'value' => $user->getId(), 'session' => $session));
        }
        //        exit;

        return $user;
    }

    /**
     * Set E-Mail address
     *
     * @param  UserList $userList
     * @param  array $userEMailAddressValues
     * @return void
     */
    public function setUserEMailAddress(UserList &$userList, $userEMailAddressValues)
    {

        $userEMailAddressManager = $this->getContainer()->get('user_e_mail_address.manager');
        $userEMailAddress = $userList->getUserEMailAddress();

        if (is_null($userEMailAddress)) {
            $userEMailAddress = new UserEMailAddress();
        }

        $userEMailAddressManager->populateUserEMailAddressObject($userEMailAddress, $userEMailAddressValues);

        $userList->setUserEMailAddress($userEMailAddress);
    }

    /**
     * Set Mobile phone number
     *
     * @param  UserList $userList
     * @param  array $userTelNoMobileValues
     * @return void
     */
    public function setUserTelNoMobileId(UserList &$userList, $userTelNoMobileValues)
    {

        $userTelNoManager = $this->getContainer()->get('user_tel_no.manager');
        $userTelNoMobile = $userList->getUserTelNoMobile();

        if (is_null($userTelNoMobile)) {
            $userTelNoMobile = new UserTelNo();
        }

        $userTelNoManager->populateUserTelNoObject($userTelNoMobile, $userTelNoMobileValues);

        $userList->setUserTelNoMobile($userTelNoMobile);
    }

    /**
     * Set Work phone number
     *
     * @param  UserList $userList
     * @param  array $userTelNoWorkValues
     * @return void
     */
    public function setUserTelNoWorkId(UserList $userList, $userTelNoWorkValues)
    {

        $userTelNoManager = $this->getContainer()->get('user_tel_no.manager');
        $userTelNoWork = $userList->getUserTelNoWork();

        if (is_null($userTelNoWork)) {
            $userTelNoWork = new UserTelNo();
        }

        $userTelNoManager->populateUserTelNoObject($userTelNoWork, $userTelNoWorkValues);

        $userList->setUserTelNoWork($userTelNoWork);
    }

    /**
     * Set Home phone number
     *
     * @param  UserList $userList
     * @param  array $userTelNoHomeValues
     * @return void
     */
    public function setUserTelNoHomeId(UserList $userList, $userTelNoHomeValues)
    {

        $userTelNoManager = $this->getContainer()->get('user_tel_no.manager');
        $userTelNoHome = $userList->getUserTelNoHome();

        if (is_null($userTelNoHome)) {
            $userTelNoHome = new UserTelNo();
        }

        $userTelNoManager->populateUserTelNoObject($userTelNoHome, $userTelNoHomeValues);

        $userList->setUserTelNoHome($userTelNoHome);
    }

    /**
     * Set Fax phone number
     *
     * @param  UserList $userList
     * @param  array $userTelNoFaxValues
     * @return void
     */
    public function setUserTelNoFaxId(UserList $userList, $userTelNoFaxValues)
    {

        $userTelNoManager = $this->getContainer()->get('user_tel_no.manager');
        $userTelNoFax = $userList->getUserTelNoFax();

        if (is_null($userTelNoFax)) {
            $userTelNoFax = new UserTelNo();
        }

        $userTelNoManager->populateUserTelNoObject($userTelNoFax, $userTelNoFaxValues);

        $userList->setUserTelNoFax($userTelNoFax);
    }

    /**
     * Set Physical Address
     *
     * @param  UserList $userList
     * @param  array $userAddressPhysicalValues
     * @return void
     */
    public function setUserAddressPhysicalId(UserList $userList, $userAddressPhysicalValues)
    {

        $userAddressManager = $this->getContainer()->get('user_address.manager');
        $userAddressPhysical = $userList->getUserAddressPhysical();

        if (is_null($userAddressPhysical)) {
            $userAddressPhysical = new UserAddress();
        }

        $userAddressManager->populateUserAddressObject($userAddressPhysical, $userAddressPhysicalValues);

        $userList->setUserAddressPhysical($userAddressPhysical);
    }

    /**
     * Set Postal Address
     *
     * @param  UserList $userList
     * @param  array $userAddressPostalValues
     * @return void
     */
    public function setUserAddressPostalId(UserList $userList, $userAddressPostalValues)
    {

        $userAddressManager = $this->getContainer()->get('user_address.manager');
        $userAddressPostal = $userList->getUserAddressPostal();

        if (is_null($userAddressPostal)) {
            $userAddressPostal = new UserAddress();
        }

        $userAddressManager->populateUserAddressObject($userAddressPostal, $userAddressPostalValues);

        $userList->setUserAddressPostal($userAddressPostal);
    }

    /**
     * Save user list from request form values array
     *
     * @param  array $requestValues
     * @param  UserList $userList
     * @return string
     */
    public function saveFromRequest($requestValues, UserList &$userList = null, UserList $owner = null, $create = true)
    {

        $return = '';
        $isNew = false;

        if (isset($requestValues['mobile_number'])) {
            $requestValues['user_tel_no_mobile'] = array('countries' => '', 'area_code' => '', 'extension' => '', 'tel_fax_number' => $requestValues['mobile_number']);
        }

        if (!isset($requestValues['user_type_id'])) {
            $requestValues['user_type_id'] = $requestValues['user_types'];
        }

        if (!isset($requestValues['id'])) {
            $requestValues['id'] = '';
        }

        if (isset($requestValues['first_name_string']) && isset($requestValues['last_name_string']) && strlen($requestValues['first_name_string']) > 0 && strlen($requestValues['last_name_string']) > 0 && $requestValues['first_name_string'] == $requestValues['last_name_string']) {
            return 'First and last name can not be the same';
        }

        //        var_dump(array_keys($requestValues));
        //        exit;

        if (isset($requestValues['e_mail_address_string']) && (!isset($requestValues['username']) || strlen($requestValues['username']) <= 0)) {
            $requestValues['username'] = $requestValues['e_mail_address_string'];
        }

        if ((!isset($requestValues['set_username_as_e_mail']) || $requestValues['set_username_as_e_mail']) && (!isset($requestValues['e_mail_address_string']) || strlen($requestValues['e_mail_address_string']) <= 0)) {
            $requestValues['e_mail_address_string'] = $requestValues['username'];
        }

        //        if ($this->getContainer()->get('banned_word.manager')->checkText($requestValues['e_mail_address_string']) || $this->getContainer()->get('banned_word.manager')->checkText($requestValues['username'])) {
        //            return 'Your profile contains text that is not allowed on this site';
        //        }

        $testUserName = $this->getEm()->getRepository(UserList::class)->checkOtherUserExists($requestValues['id'], $requestValues['username']);
        $userListTest = $this->findOneBy(array('username' => $requestValues['username']));

        $eMailAddress = '';

        if (isset($requestValues['e_mail_address_string'])) {
            $eMailAddress = $requestValues['e_mail_address_string'];
        }

        if (strlen($eMailAddress) <= 0) {
            $eMailAddress = microtime() . '-cesa@igotafrica.com.co.za';
        }

        if (!is_object($userListTest)) {
            $userListTest = $this->findOneByEMailAddress($eMailAddress);
        }

        $foundByIDNumber = false;

        if (is_object($userListTest) && isset($requestValues['id_number']) && strlen($requestValues['id_number']) > 0 && $userListTest->getIdNumber() != $requestValues['id_number']) {
            $userListTest = $this->findOneBy(array('id_number' => $requestValues['id_number']));
            $userList = $userListTest;
            $requestValues['username'] = $requestValues['id_number'];
            $foundByIDNumber = true;
        }

        if (!$create && is_object($userListTest)) {
            return;
        }

        if ($testUserName && is_object($owner) && is_object($userListTest)) {
            //Link as a contact
            $this->getContainer()->get('user_contact.manager')->linkUser($owner, $userListTest);
            $userList = $userListTest;
            return 'That user was linked as a contact';
        } elseif ($testUserName && !is_object($owner) && is_object($userListTest) && $userListTest->getCreatedBy() != $owner->getId()) {
            $userList = $userListTest;
            return 'That user name or e-mail address is already in use';
        }

        if ($testUserName && is_object($owner) && is_object($userListTest) && $userListTest->getCreatedBy() == $owner->getId()) {
            $userList = $userListTest;
        }

        if ((strlen($requestValues['id']) > 0) || ($requestValues['id'] > 0)) {
            $userList = $this->find($requestValues['id']);
        }

        $userListTestEMail = $this->findOneByEMailAddress($eMailAddress);

        if (!$create && !$foundByIDNumber && is_object($userListTestEMail)) {
            return;
        }

        if ((!$foundByIDNumber && is_object($userListTestEMail) && is_object($userList) && $userListTestEMail->getId() != $userList->getId()) || (!$foundByIDNumber && is_object($userListTestEMail) && !is_object($userList))) {
            $userList = $userListTestEMail;
            return 'That e-mail address is already in use by ' . $userListTestEMail->getUsername();
        }

        if (!is_object($userList)) {
            $userList = new UserList();
            $isNew = true;
        }

        $userList->setUsername($requestValues['username']);

        $requestValues['update_password'] = true;

        if (!isset($requestValues['password'])) {
            $requestValues['password'] = array('password' => '');
        }

        if (!is_array($requestValues['password'])) {
            $requestValues['password'] = array('password' => $requestValues['password']);
        }

        if (!isset($requestValues['ignore_empty_pwd'])) {
            $requestValues['ignore_empty_pwd'] = false;
        }

        if ((isset($requestValues['password']['password'])) && (strlen($requestValues['password']['password']) > 0)) {
            $userList->setPlainPassword($requestValues['password']['password']);
        } elseif (!$requestValues['ignore_empty_pwd']) {
            $userList->setPlainPassword(microtime());
        }

        if (!isset($requestValues['is_active'])) {
            $requestValues['is_active'] = true;
        }

        if (!isset($requestValues['is_super_admin'])) {
            $requestValues['is_super_admin'] = false;
        }

        if (!isset($requestValues['deleted'])) {
            $requestValues['deleted'] = false;
        }

        if (!isset($requestValues['e_mail_address_subscribed'])) {
            $requestValues['e_mail_address_subscribed'] = false;
        }

        $userList->setIsActive($requestValues['is_active']);
        $userList->setDeleted($requestValues['deleted']);

        if ($userList->getGranted('ROLE_SUPER_ADMINISTRATOR')) {
            $userList->setIsSuperAdmin(true);
        } else {
            $userList->setIsSuperAdmin($requestValues['is_super_admin']);
        }

        if (isset($requestValues['e_mail_address_string'])) {
            $userList->setEMailAddressString($requestValues['e_mail_address_string']);
        }

        if (isset($requestValues['user_tel_no_mobile'])) {
            $userList->setMobileNumber($requestValues['user_tel_no_mobile']);
        }

        if (isset($requestValues['first_name_string'])) {
            $userList->setFirstNameString($requestValues['first_name_string']);
        }

        if (isset($requestValues['last_name_string'])) {
            $userList->setLastNameString($requestValues['last_name_string']);
        }

        if (isset($requestValues['id_number'])) {
            $userList->setIdNumber($requestValues['id_number']);
        }

        if (isset($requestValues['short_code'])) {
            $userList->setReferredBy($requestValues['short_code']);
        }

        if (is_object($owner) && (strlen($userList->getCreatedBy()) <= 0 || $userList->getCreatedBy() == '-')) {
            $userList->setCreatedBy($owner->getId());
        }

        if ($requestValues['update_password']) {
            $this->updatePassword($userList);
        }

        $this->checkRequestValues($userList);

        $this->save($userList);
        $this->getEm()->refresh($userList);

        if (isset($requestValues['bank_id']) && strlen($requestValues['bank_id']) > 0) {

            $bankDetail = $userList->getUserBankDetail();

            if (!is_object($bankDetail)) {
                $bankDetail = new UserBankDetail();
            }

            $bank = $this->getContainer()->get('banks.manager')->find($requestValues['bank_id']);

            if (is_object($bank)) {

                $bankDetail->setBank($bank);
                $bankDetail->setAccountName($requestValues['account_name']);
                $bankDetail->setAccountNumber($requestValues['account_number']);
                $bankDetail->setUserList($userList);

                $this->getContainer()->get('user_bank_detail.manager')->save($bankDetail);

                $userList->setUserBankDetail($bankDetail);
                $this->save($userList);
                $this->getEm()->refresh($userList);
            } else {
                return 'User created, but invalid bank details';
            }
        }

        if ($this->getContainer()->get('system_setting.manager')->getSetting('user_register_verify_e_mail', 0) > 0 && $isNew) {

            $userList->setIsActive(false);
            $this->save($userList);

            //            $this->sendAccountVerifyMail($userList);
        } elseif ($isNew) {
            //            $this->sendWelcomeMail($userList);
        }

        $userRoleOnRegister = json_decode($this->getContainer()->get('system_setting.manager')->getSetting('user_register_roles', '[]', true), true);

        if (is_array($userRoleOnRegister) && count($userRoleOnRegister) > 0) {
            $this->linkAccessLevel($userList, $userRoleOnRegister);
        }

        //        $userFieldUserManager = $this->getContainer()->get('user_field_user.manager');
        //        $fields = $this->getContainer()->get('user_field.manager')->getSiteListQuery(array('user_list' => $this->getLoggedInUser()))->execute();
        //        foreach ($fields as $field) {
        //            $valueIndex = strtolower(Utils::getIdString($field->getFieldName()));
        //            if (isset($requestValues['user_field_' . $valueIndex]) && strlen($requestValues['user_field_' . $valueIndex]) > 0) {
        //                $userFieldUserManager->saveOne($field, $userList, $requestValues['user_field_' . $valueIndex]);
        //            }
        //        }

        return $return;
    }

    /**
     * Check for default values in the values array
     *
     * @param  array $requestValues
     * @return array
     */
    public function checkRequestValues(UserList &$userList)
    {

        if (is_null($userList->getFirstNameString())) {
            $userList->setFirstNameString('');
        }

        if (is_null($userList->getLastNameString())) {
            $userList->setLastNameString('');
        }

        if (is_null($userList->isIsSuperAdmin())) {
            $userList->setIsSuperAdmin(false);
        }

        if (is_null($userList->isIsActive())) {
            $userList->setIsActive(false);
        }

        if (is_null($userList->isDeleted())) {
            $userList->setDeleted(false);
        }

        if (is_null($userList->getAlgorithm())) {
            $userList->setAlgorithm('sha1');
        }

        if (is_null($userList->getSalt())) {
            $userList->setSalt(uniqid());
        }

        if (is_null($userList->isEMailAddressSubscribed())) {
            $userList->setEMailAddressSubscribed(true);
        }

        return $userList;
    }

    /**
     * Send a reset password link
     *
     * @param string $email
     * @return array
     */
    public function sendResetLink($email)
    {

        $return = array('success' => false, 'message' => '');

        $settingManager = $this->getContainer()->get('system_setting.manager');
        $messageManager = $this->getContainer()->get('contact_message.manager');

        $recipient = $this->em->getRepository(UserList::class)->findOneByEMailAddress(
            array(
                'e_mail_address' => $email,
                //                    'user_type_id' => array(
                //                        $settingManager->getSetting('crm_user_type'),
                //                        $settingManager->getSetting('fe_user_type'),
                //                    )
            )
        );

        if (!is_object($recipient)) {
            $return['message'] = 'That email address does not exist. Please try again.';
            return $return;
        }

        if ($recipient->getCreatedAt()->getTimestamp() >= (time() - (60 * 60 * 24))) {
            $return['message'] = 'Too soon to reset your password. Please try again later.';
            return $return;
        }

        $sender = $this->em->getRepository(UserList::class)->findOneByEMailAddress(
            array(
                'e_mail_address' => $messageManager->getSystemEMail(),
                'user_type_id' => array(
                    $settingManager->getSetting('admin_user_type'),
                    $settingManager->getSetting('crm_user_type'),
                    $settingManager->getSetting('fe_user_type'),
                )
            )
        );

        if (!is_object($sender)) {

            $userValues['user_type_id'] = $settingManager->getSetting('crm_user_type');
            $userValues['username'] = $messageManager->getSystemEMail();
            $userValues['password'] = microtime();
            $userValues['first_name_string'] = $settingManager->getSetting('contact_from_name');

            $userValues['e_mail_address'] = $messageManager->getSystemEMail();

            $error = $this->saveFromRequest($userValues);

            if (strlen($error) > 0) {
                $return['message'] = $error;
                return $return;
            }

            $sender = $this->em->getRepository(UserList::class)->findOneByEMailAddress(array('e_mail_address' => $messageManager->getSystemEMail()));

            if (!is_object($sender)) {
                $return['message'] = 'Unable to generate sender. Please try again.';
                return $return;
            }
        }

        $messageType = $this->em->getRepository(MessageType::class)->find($settingManager->getSetting('contact_message_type_sys_notif'));
        $contactMethod = $this->em->getRepository(ContactMethod::class)->find($settingManager->getSetting('contact_method_e_mail'));
        $contactReason = $this->em->getRepository(ContactReason::class)->find($settingManager->getSetting('contact_reason_reset_password'));

        $twig = $this->getContainer()->get('service_getter.manager')->getTwig();
        $router = $this->getContainer()->get('router');

        //        $resetPasswordToken = Utils::encryptString('time=' . time() . '&user_list_id=' . $recipient->getId());
        //        $resetPasswordUrl = 'http://' . $_SERVER['HTTP_HOST'] . $router->generate(
        //                        'iga_user_reset_pw', array('token' => $resetPasswordToken)
        //        );
        $resetPasswordUrl = 'http://' . $_SERVER['HTTP_HOST'] . $router->generate('iga_user_reset_pw');

        $resetCode = random_int(135630, 987342);
        $this->getContainer()->get('temp_value.manager')->setTempValue('reset_pwd_' . $resetCode, 'time=' . time() . '&user_list_id=' . $recipient->getId());

        $subject = 'Reset password request';
        $messageHtml = '<p>Dear ' . $recipient->getFullNameString() . '</p>'
            . '<p><a href="' . $resetPasswordUrl . '"><font color="#e51521">Click here to reset your password.</font></a></p>'
            . '<p>Enter this code to confirm your password reset: ' . $resetCode . '</p>'
            . '<p>If you did not initiate this password reset procedure, please report this event to us immediately.</p>';
        $messageText = 'Dear ' . $recipient->getFullNameString() . '' . "\r\n\r\n"
            . 'Follow this link to reset your password: '
            . $resetPasswordUrl . "\r\n\r\n"
            . 'Enter this code to confirm your password reset: ' . $resetCode . "\r\n\r\n"
            . 'If you did not initiate this password reset procedure, please report this event to us immediately.' . "\r\n\r\n";

        //Send Contact us form data
        $messageHTML = $twig->render(
            '@ContactBundle/Email/notification.html.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageHtml,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST']
            )
        );
        $messageText = $twig->render(
            '@ContactBundle/Email/notification.txt.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageText,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST']
            )
        );

        $messageValues = array(
            'subject' => $subject,
            'messageHTML' => $messageHTML,
            'messageText' => $messageText,
            'contactMethod' => $contactMethod,
            'contactReason' => $contactReason,
            'messageType' => $messageType,
        );

        $msg = $messageManager->saveMessage($sender, array($recipient), $messageValues);

        //        echo $msg;
        //        exit;

        $return['success'] = true;

        return $return;
    }

    /**
     * Check a reset password token
     *
     * @param string $token
     * @return UserList
     */
    public function getTokenValues($token)
    {

        //        $OpensslEncryption = new Openssl_EncryptDecrypt();
        //        $valueString = $OpensslEncryption->decrypt($token);
        //        $valueString = Utils::decryptString($token);
        //        var_dump($valueString);
        //        exit;

        $valuesCheck = explode('&', $token);
        $values = array();

        foreach ($valuesCheck as $valueCheck) {
            $oneValue = explode('=', $valueCheck);
            $values[$oneValue[0]] = $oneValue[1];
        }

        if ($values['time'] + (60 * 60 * 24) <= time()) {
            //token has expired
            $values['user_list'] = null;

            return $values;
        }

        $values['user_list'] = $this->find($values['user_list_id']);

        if (!isset($values['allow'])) {
            $values['allow'] = 0;
        }

        return $values;
    }

    /**
     * Check a reset password token
     *
     * @param string $token
     * @return UserList
     */
    public function checkToken($token)
    {

        $values = $this->getTokenValues($token);

        return $values['user_list'];
    }

    /**
     * Check a reset password token
     *
     * @param string $token
     * @return UserList
     */
    public function checkResetCode($resetCode)
    {

        $token = $this->getContainer()->get('temp_value.manager')->getTempValue('reset_pwd_' . $resetCode);
        $values = $this->getTokenValues($token);

        return $values['user_list'];
    }

    /**
     * Get array of users
     *
     * @param Sites $site
     * @param integer $limit
     * @return array
     */
    public function getArray(Sites $site, $limit = 0)
    {
        return $this->em->getRepository(UserList::class)->getArray($site, $limit);
    }

    /**
     * Check for a user by e-mail address and return it or create it
     *
     * @param  array $requestValues
     * @return array
     */
    public function findOrCreate($emailAddress, $firstName, $lastName, UserList $referredBy = null)
    {

        $userList = $this->findOneBy(array('username' => $emailAddress));

        if (!is_object($userList)) {
            $userList = $this->findOneByEMailAddress($emailAddress);
        }

        if (!is_object($userList)) {
            $userList = new UserList();
            $userList->setPassword(microtime());

            if (is_object($referredBy)) {
                $userList->setReferredBy($referredBy->getId());
            }
        }

        $userList->setUsername($emailAddress);
        $userList->setFirstNameString($firstName);
        $userList->setLastNameString($lastName);
        $this->setUserEMailAddress($userList, array('e_mail_address' => $emailAddress));

        $this->checkRequestValues($userList);
        $this->save($userList);

        return $userList;
    }

    /**
     * Log a user in automatically
     *
     * @param  UserList $userList
     * @return void
     */
    public function doLogin(Request &$request, UserList &$userList, $forceLogin = false)
    {

        if (!$forceLogin) {
            if (!in_array($userList->getUserTypes()->getId(), array(
                $this->getContainer()->get('user_types.manager')->getFrontendUserTypeId()->getId(),
                $this->getContainer()->get('user_types.manager')->getAdminUserTypeId()->getId(),
            ))) {
                $userList->setUserTypes($this->getContainer()->get('user_types.manager')->getFrontendUserType());
            }

            if ($userList->getIsActive()) {
                throw new \Exception('You are already registered on the site. Please log in.');
            }

            $userList->setIsActive(true);
            $userList->setDeleted(false);
            $this->save($userList);
        }

        $token = new UsernamePasswordToken($userList, 'secured_area', $userList->getRoles());
        $this->securityContext->setToken($token);
        $this->getContainer()->get('session')->set('_security_secured_area', serialize($token));

        $event = new InteractiveLoginEvent($request, $token);
        $this->getContainer()->get("event_dispatcher")->dispatch($event, "security.interactive_login");

        //        $testUser = $this->getLoggedInUser();
        //        echo $testUser->getUsername() . ' - ' . $testUser->getId() . '<br />';
        //        var_dump($testUser->getRoles());
        //        exit;
    }

    /**
     * Import users from a spreadsheet
     *
     * @param  array $conf
     * @return void
     */
    public function importUsers($conf = array())
    {

        $this->getEm()->getConnection()->getConfiguration()->setSQLLogger(null);

        try {

            if (!isset($conf['fieldsToColumns']) || !isset($conf['fileId']) || !isset($conf['ownerId']) || !isset($conf['companyId']) || !isset($conf['userTypeId'])) {
                throw new \Exception('Not all parameters specified: ' . json_encode($conf));
            }

            $file = $this->getContainer()->get('files.manager')->find($conf['fileId']);

            if (!is_object($file)) {
                throw new \Exception('Invalid file: ' . $conf['fileId']);
            }

            $owner = $this->find($conf['ownerId']);

            if (!is_object($owner)) {
                throw new \Exception('Invalid owner: ' . $conf['ownerId']);
            }

            $company = $this->getContainer()->get('companies.manager')->find($conf['companyId']);

            if (!is_object($company)) {
                //                throw new \Exception('Invalid company: ' . $conf['companyId']);
            }

            $userType = $this->getContainer()->get('user_types.manager')->find($conf['userTypeId']);

            if (!is_object($userType)) {
                throw new \Exception('Invalid user type: ' . $conf['userTypeId']);
            }

            $fields = $this->getContainer()->get('user_field.manager')->getSiteListQuery(array('user_list' => $this->getLoggedInUser()))->execute();
            $userFieldUserManager = $this->getContainer()->get('user_field_user.manager');

            $filePath = "/tmp/";
            $fileContent = $file->getFileDataString();
            $this->getContainer()->get('files.manager')->saveFromStringToPath($fileContent, $file->getOriginalFileName(), $filePath);

            $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($filePath . $file->getOriginalFileName());

            $rows = $spreadsheet->getActiveSheet()->getRowIterator(2, 1E6);
            $rowFeedback = array();
            $rowCnt = 2;
            $emptyCnt = 0;

            foreach ($rows as $row) {

                $rowData = array();
                $cellNo = 0;

                foreach ($row->getCellIterator() as $cell) {

                    if (strlen($cell) > 0) {
                        $rowData[$cellNo] = $cell->getValue();
                    }

                    $cellNo++;
                } //foreach cell
                //                echo count($rowData) . "\r\n";

                if (count($rowData) > 0) {

                    $emptyCnt = 0;

                    $rowFeedback[$rowCnt] = 'Success';
                    $userValues = array('user_type_id' => $userType, 'username' => '', 'first_name_string' => '', 'last_name_string' => '');

                    if (isset($rowData[$conf['fieldsToColumns']['first_name']]) && strlen($rowData[$conf['fieldsToColumns']['first_name']]) > 0) {
                        $userValues['first_name_string'] = $rowData[$conf['fieldsToColumns']['first_name']];
                    }

                    if (isset($rowData[$conf['fieldsToColumns']['last_name']]) && strlen($rowData[$conf['fieldsToColumns']['last_name']]) > 0) {
                        $userValues['last_name_string'] = $rowData[$conf['fieldsToColumns']['last_name']];
                    }

                    if (isset($rowData[$conf['fieldsToColumns']['username']]) && strlen($rowData[$conf['fieldsToColumns']['username']]) > 0) {
                        $userValues['username'] = $rowData[$conf['fieldsToColumns']['username']];
                    }

                    if (isset($rowData[$conf['fieldsToColumns']['e_mail']]) && strlen($rowData[$conf['fieldsToColumns']['e_mail']]) > 0) {
                        $userValues['e_mail_address_string'] = $rowData[$conf['fieldsToColumns']['e_mail']];
                        $userValues['e_mail_address_subscribed'] = true;
                    }

                    if (isset($rowData[$conf['fieldsToColumns']['mobile_number']]) && strlen($rowData[$conf['fieldsToColumns']['mobile_number']]) > 0) {
                        $userValues['user_tel_no_mobile'] = array(
                            'tel_fax_number' => $rowData[$conf['fieldsToColumns']['mobile_number']],
                            'countries' => null,
                            'area_code' => '',
                            'extension' => '',
                            'opted_in' => true
                        );
                    }

                    if (!isset($userValues['username']) || strlen($userValues['username']) <= 0) {

                        if (isset($userValues['user_tel_no_mobile'])) {
                            $userValues['username'] = $userValues['user_tel_no_mobile'];
                        }

                        if (isset($userValues['e_mail_address_string'])) {
                            $userValues['username'] = $userValues['e_mail_address_string'];
                        } elseif (isset($userValues['user_tel_no_mobile'])) {
                            $userValues['username'] = $userValues['user_tel_no_mobile']['tel_fax_number'];
                        } elseif (isset($userValues['first_name_string'])) {
                            $userValues['username'] = str_replace(' ', '', strtolower($userValues['first_name_string']));
                        }
                    }

                    $userList = null;
                    $errorMsg = $this->saveFromRequest($userValues, $userList, $owner);

                    if (!empty($errorMsg) && strpos($errorMsg, 'already in use') <= 0) {
                        $rowFeedback[$rowCnt] = 'Failure: ' . $errorMsg;
                        echo 'Failure: ' . $errorMsg . "\r\n";
                    } elseif (is_object($company) && is_object($userList)) {
                        $this->getContainer()->get('companies.manager')->linkUser($company, $userList);
                        $this->getContainer()->get('user_contact.manager')->linkUser($owner, $userList, $company);
                    }

                    //                    $this->getContainer()->get('error_log.manager')->info('Import row data: ' . print_r($rowData, true) . ' - ' . is_object($userList));
                    if (isset($rowData[$conf['fieldsToColumns']['group']]) && !empty($rowData[$conf['fieldsToColumns']['group']]) && is_object($userList)) {

                        $userGroup = null;
                        //                        $this->getContainer()->get('error_log.manager')->info('Link user to group: ' . $rowData[$conf['fieldsToColumns']['group']]);
                        //                        echo $rowData[$conf['fieldsToColumns']['group']] . "\r\n";

                        $this->getContainer()->get('user_group.manager')->saveFromRequest(array('group_name' => $rowData[$conf['fieldsToColumns']['group']]), $userGroup, $owner);
                        $this->getContainer()->get('user_group.manager')->linkUser($userGroup, $userList, $owner);
                    }

                    //                    unset($userValues['user_type_id']);
                    //                    var_dump($userValues);
                    //                    var_dump($rowData);
                    //                    echo $userValues['username'] . ' - ' . $userValues['first_name_string'] . ' ' . $userValues['last_name_string'] . "\r\n";
                    //                    exit;

                    if (is_object($userList)) {
                        foreach ($fields as $field) {

                            $valueIndex = strtolower(Utils::getIdString($field->getFieldName()));

                            if (isset($conf['fieldsToColumns']['user_field_' . $valueIndex]) && isset($rowData[$conf['fieldsToColumns']['user_field_' . $valueIndex]]) && strlen($rowData[$conf['fieldsToColumns']['user_field_' . $valueIndex]]) > 0) {
                                $userFieldUserManager->saveOne($field, $userList, $rowData[$conf['fieldsToColumns']['user_field_' . $valueIndex]]);
                            }
                        } //foreach field
                    }
                }

                $emptyCnt++;
                $rowCnt++;

                if ($emptyCnt > 100) {
                    //                    echo "Too many empty rows \r\n";
                    break;
                }
            } //foreach
            //            echo "Import done \r\n";

            $subject = 'Your import is complete';
            $message = '<p>Dear ' . $owner->getFullNameString() . '</p>'
                . '<p>This is the result of the import:</p>'
                . '<p>';

            foreach ($rowFeedback as $rowNum => $messageString) {
                $message .= 'Row ' . $rowNum . ': ' . $messageString . '<br />';
            }

            $message .= '</p>';

            $this->getContainer()->get('contact_message.manager')->sendNotificationMail($owner, $subject, $message);
        } catch (\Exception $ex) {
            $message = $ex->getMessage() . ' - ' . $ex->getTraceAsString();
            //            echo $message . "\r\n";
            $this->getContainer()->get('error_log.manager')->error('Error on user import - ' . $message);
        }
    }

    /**
     * Load user list data
     *
     * @param UserList $userList
     * @return void
     */
    public function loadUser(UserList &$userList)
    {

        if (count($userList->getCompanyIds()) <= 0) {

            $companyIds = array();
            $userListIDs = $this->getEm()->getRepository(UserList::class)->getCompanyIds($userList);

            foreach ($userListIDs as $userListID) {
                $companyIds[] = $userListID['id'];
            }

            //            var_dump($companyIds);
            //            echo '<br />';

            $userList->setCompanyIds($companyIds);
        }
    }

    /**
     * Check if owner can edit user
     *
     * @param UserList $userList
     * @param UserList $owner
     * @return boolean
     */
    public function canEdit(UserList $userList, UserList $owner)
    {

        if ($owner->getGranted('ROLE_SUPER_ADMINISTRATOR')) {
            return true;
        }

        if ($userList->getId() == $owner->getId()) {
            return true;
        }

        if ($userList->getCreatedBy() == $owner->getId() || strlen($userList->getId()) <= 0) {
            return true;
        }

        $agentIds = array();
        //        echo $owner;

        foreach ($owner->getCompanies() as $company) {
            $users = $this->findBySearchCompanyForSelect('', $company->getId());

            //            echo count($users) . '<br />';

            foreach ($users as $userName => $userId) {
                //                echo 'checking ' . $userName . '<br />';
                if ($userId == $userList->getId()) {
                    return true;
                }
            }
        }

        //        exit;
        return false;
    }

    /**
     * Check if a user is linked to an access level.
     *
     * @param Companies $company
     * @param UserList  $userList
     */
    public function isLinked(UserList &$userList, AccessLevel $accessLevel)
    {

        if (!is_iterable($userList->getAccessLevel())) {
            return false;
        }

        foreach ($userList->getAccessLevel() as $testAccessLevel) {
            if ($testAccessLevel->getId() == $accessLevel->getId()) {
                return true;
            }
        }

        return false;
    }

    /**
     * Link a user to access level(s)
     *
     * @param UserList $userList
     * @param array $accessLevelIds
     */
    public function linkAccessLevel(UserList &$userList, $accessLevelIds)
    {

        $accessLevelManager = $this->getContainer()->get('access_level.manager');

        foreach ($accessLevelIds as $accessLevelId) {

            $accessLevel = $accessLevelManager->find($accessLevelId);

            if (!$this->isLinked($userList, $accessLevel)) {

                $userList->addAccessLevel($accessLevel);

                $this->save($userList);
            }
        }
    }

    /**
     * Get user's company
     *
     * @param UserList $userList
     * @return Companies|null
     */
    public function getCompany(UserList $userList)
    {

        foreach ($userList->getCompanies() as $company) {
            return $company;
        }

        return null;
    }

    /**
     * Get user's company
     *
     * @param UserList $userList
     * @return Companies|null
     */
    public function getSiteAdmins()
    {
        $adminUserType = $this->getContainer()->get('user_types.manager')->find($this->getContainer()->get('system_setting.manager')->getSetting('admin_user_type'));
        $admins = $this->findBy(array('user_types' => $adminUserType));
        $return = array();

        foreach ($admins as $admin) {
            if (is_object($admin->getUserEMailAddress()) && $admin->getUserEMailAddress()->getSubscribed()) {
                $return[] = $admin;
            }
        } //foreach

        return $return;
    }

    /**
     * Get user's company
     *
     * @param UserList $userList
     * @return Companies|null
     */
    public function getAllFrontendUsers(Companies $company = null)
    {
        $admins = $this->findByAccessLevels(array($this->getContainer()->get('access_level.manager')->getWebSiteAccessLevel()), array('company' => $company));
        $return = array();

        foreach ($admins as $admin) {
            $return[] = $admin;
        } //foreach

        return $return;
    }

    /**
     * Get user's company
     *
     * @param UserList $userList
     * @return Companies|null
     */
    public function getAdmins()
    {
        $admins = $this->findByAccessLevels(array($this->getContainer()->get('access_level.manager')->getAdminAccessLevelId()));
        $return = array();

        foreach ($admins as $admin) {
            if (is_object($admin->getUserEMailAddress()) && $admin->getUserEMailAddress()->getSubscribed()) {
                $return[] = $admin;
            }
        } //foreach

        return $return;
    }

    /**
     * Send a reset password link
     *
     * @param string $email
     * @return array
     */
    public function notifyAdmins(UserList $userList, $registered = true)
    {

        $return = array('success' => false, 'message' => '');

        $settingManager = $this->getContainer()->get('system_setting.manager');
        $messageManager = $this->getContainer()->get('contact_message.manager');

        $recipients = $this->getSiteAdmins();

        if (count($recipients) <= 0) {
            return;
        }

        $messageType = $this->em->getRepository(MessageType::class)->find($settingManager->getSetting('contact_message_type_sys_notif'));
        $contactMethod = $this->em->getRepository(ContactMethod::class)->find($settingManager->getSetting('contact_method_e_mail'));
        $contactReason = $this->em->getRepository(ContactReason::class)->find($settingManager->getSetting('contact_reason_type_sys_notif'));

        $twig = $this->getContainer()->get('twig');
        $router = $this->getContainer()->get('router');
        $bidderRegister = $settingManager->getSetting('auction_bidder_register', 0);

        $subject = $messageManager->getSystemName() . ' - User registered notification';
        $messageHtml = '<p>To whom it may concern</p>'
            . '<p>User ' . $userList->getUsername() . ' has registered</p>';
        $messageText = 'To whom it may concern' . "\r\n\r\n"
            . 'User ' . $userList->getUsername() . ' has registered' . "\r\n\r\n";

        if (!$registered) {
            $subject = $messageManager->getSystemName() . ' - User updated notification';
            $messageHtml = '<p>To whom it may concern</p>'
                . '<p>User ' . $userList->getUsername() . ' has updated details</p>';
            $messageText = 'To whom it may concern' . "\r\n\r\n"
                . 'User ' . $userList->getUsername() . ' has updated details' . "\r\n\r\n";
        }

        if ($bidderRegister > 0 && strlen($userList->getIdNumber()) > 0) {
            $messageHtml .= '<p>The user has requested to be registered as a bidder</p>';
            $messageText .= 'The user has requested to be registered as a bidder' . "\r\n\r\n";
        }

        $messageHtml .= '<p><a href = "' . $router->generate('users_edit', array('id' => $userList->getId(), 'user_type_id' => $settingManager->getSetting('fe_user_type')), UrlGeneratorInterface::ABSOLUTE_URL) . '">Click here to edit the user\'s profile</a></p>';
        $messageText .= 'Follow this URL to the user\'s profile: ' . $router->generate('users_edit', array('id' => $userList->getId(), 'user_type_id' => $settingManager->getSetting('fe_user_type')), UrlGeneratorInterface::ABSOLUTE_URL) . "\r\n\r\n";

        //Send Contact us form data
        $messageHTML = $twig->render(
            '@ContactBundle/Email/notification.html.twig',
            array(
                'sender' => $userList,
                'contactFromName' => $userList->getFullNameString(),
                'contactFromEMail' => $userList->getEMailAddressString(),
                'messageText' => $messageHtml,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST'],
            )
        );
        $messageText = $twig->render(
            '@ContactBundle/Email/notification.txt.twig',
            array(
                'sender' => $userList,
                'contactFromName' => $userList->getFullNameString(),
                'contactFromEMail' => $userList->getEMailAddressString(),
                'messageText' => $messageText,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST'],
            )
        );

        $messageValues = array(
            'subject' => $subject,
            'messageHTML' => $messageHTML,
            'messageText' => $messageText,
            'contactMethod' => $contactMethod,
            'contactReason' => $contactReason,
            'messageType' => $messageType,
        );

        $messageManager->saveMessage($userList, $recipients, $messageValues);

        $return['success'] = true;

        return $return;
    }

    /**
     * Send a reset password link
     *
     * @param string $email
     * @return array
     */
    public function sendAccessLevelNotify(UserList $userList, $message = '')
    {

        $return = array('success' => false, 'message' => '');

        $settingManager = $this->getContainer()->get('system_setting.manager');
        $messageManager = $this->getContainer()->get('contact_message.manager');

        $messageType = $this->em->getRepository(MessageType::class)->find($settingManager->getSetting('contact_message_type_sys_notif'));
        $contactMethod = $this->em->getRepository(ContactMethod::class)->find($settingManager->getSetting('contact_method_e_mail'));
        $contactReason = $this->em->getRepository(ContactReason::class)->find($settingManager->getSetting('contact_reason_type_sys_notif'));

        $twig = $this->getContainer()->get('twig');
        $sender = $messageManager->getSystemUser();

        $subject = 'Your access details have been updated on ' . $messageManager->getSystemName();
        $messageHtml = '<p>Dear ' . $userList->getFirstNameString() . '</p>'
            . '<p>Your access details for user ' . $userList->getUsername() . ' using this e-mail address have been updated by the web site administrators. Please log out and log back in for the changes to take effect.</p>';
        $messageText = 'Dear ' . $userList->getFirstNameString() . "\r\n\r\n"
            . 'Your access details for user ' . $userList->getUsername() . ' using this e-mail address have been updated by the web site administrators. Please log out and log back in for the changes to take effect.' . "\r\n\r\n";

        if (strlen($message) > 0) {
            $messageHtml .= '<p>The following message accompanied the update:</p>'
                . '<p>' . $message . '</p>';
            $messageText .= 'The following message accompanied the update:' . "\r\n\r\n"
                . $message . "\r\n\r\n";
        }

        //Send Contact us form data
        $messageHTML = $twig->render(
            '@ContactBundle/Email/notification.html.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageHtml,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST']
            )
        );
        $messageText = $twig->render(
            '@ContactBundle/Email/notification.txt.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageText,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST']
            )
        );

        $messageValues = array(
            'subject' => $subject,
            'messageHTML' => $messageHTML,
            'messageText' => $messageText,
            'contactMethod' => $contactMethod,
            'contactReason' => $contactReason,
            'messageType' => $messageType,
        );

        $messageManager->saveMessage($sender, array($userList), $messageValues);

        $return['success'] = true;

        return $return;
    }

    /**
     * Send a reset password link
     *
     * @param string $email
     * @return array
     */
    public function sendRejectDocNotify(UserList $userList)
    {

        if (strlen($userList->getIdDocFileId()) > 0) {
            $this->getContainer()->get('files.manager')->removeById($userList->getIdDocFileId());
            $userList->setIdDocFileId('');
        }

        $return = array('success' => false, 'message' => '');

        $settingManager = $this->getContainer()->get('system_setting.manager');
        $messageManager = $this->getContainer()->get('contact_message.manager');

        $messageType = $this->em->getRepository(MessageType::class)->find($settingManager->getSetting('contact_message_type_sys_notif'));
        $contactMethod = $this->em->getRepository(ContactMethod::class)->find($settingManager->getSetting('contact_method_e_mail'));
        $contactReason = $this->em->getRepository(ContactReason::class)->find($settingManager->getSetting('contact_reason_type_sys_notif'));

        $twig = $this->getContainer()->get('twig');
        $sender = $messageManager->getSystemUser();

        $subject = 'Your ID document has been rejected by ' . $messageManager->getSystemName();
        $messageHtml = '<p>Dear ' . $userList->getFirstNameString() . '</p>'
            . '<p>The ID document you uploaded has been rejected by the web site administrators. Please log in and upload the correct documents on the My Details screen.</p>';
        $messageText = 'Dear ' . $userList->getFirstNameString() . "\r\n\r\n"
            . 'The ID document you uploaded has been rejected by the web site administrators. Please log in and upload the correct documents on the My Details screen.' . "\r\n\r\n";

        //Send Contact us form data
        $messageHTML = $twig->render(
            '@ContactBundle/Email/notification.html.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageHtml,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST']
            )
        );
        $messageText = $twig->render(
            '@ContactBundle/Email/notification.txt.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageText,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST']
            )
        );

        $messageValues = array(
            'subject' => $subject,
            'messageHTML' => $messageHTML,
            'messageText' => $messageText,
            'contactMethod' => $contactMethod,
            'contactReason' => $contactReason,
            'messageType' => $messageType,
        );

        $messageManager->saveMessage($sender, array($userList), $messageValues);

        $return['success'] = true;

        return $return;
    }

    /**
     * Unsubsribe user from newsletter
     *
     * @param string $unsub
     * @return string
     */
    public function unsubscribe($unsub)
    {

        $OpensslEncryption = new Openssl_EncryptDecrypt();

        $userListId = $OpensslEncryption->decrypt($unsub);

        $userList = $this->find($userListId);

        if (!is_object($userList)) {
            return 'Ths user does not exist in our database';
        }

        $eMailAddress = $userList->getUserEMailAddress();
        $eMailAddress->setSubscribed(false);

        $this->getContainer()->get('user_e_mail_address.manager')->save($eMailAddress);

        $mobile = $userList->getUserTelNoMobile();
        $mobile->setOptedIn(false);

        $this->getContainer()->get('user_tel_no.manager')->save($eMailAddress);
    }

    /**
     * Send an account verify link
     *
     * @param UserList $userList
     * @return null
     */
    public function sendAccountVerifyMail(UserList $userList)
    {

        $settingManager = $this->getContainer()->get('system_setting.manager');
        $messageManager = $this->getContainer()->get('contact_message.manager');

        $messageType = $this->em->getRepository(MessageType::class)->find($settingManager->getSetting('contact_message_type_sys_notif'));
        $contactMethod = $this->em->getRepository(ContactMethod::class)->find($settingManager->getSetting('contact_method_e_mail'));
        $contactReason = $this->em->getRepository(ContactReason::class)->find($settingManager->getSetting('contact_reason_type_sys_notif'));

        $twig = $this->getContainer()->get('twig');
        $router = $this->getContainer()->get('router');
        $sender = $messageManager->getSystemUser();

        $verifyToken = Utils::encryptString('time=' . time() . '&user_list_id=' . $userList->getId());

        $resetPasswordUrl = 'http://' . $_SERVER['HTTP_HOST'] . $router->generate(
            'login',
            array('token_verify_e_mail' => $verifyToken)
        );

        $subject = 'Please verify your e-mail address registered on ' . $messageManager->getSystemName();
        $messageHtml = '<p>Dear ' . $userList->getFirstNameString() . '</p>'
            . '<p>Please click here to verify your e-mail address: <a href="' . $resetPasswordUrl . '">' . $userList->getEMailAddressString() . '</a>.</p>';
        $messageText = 'Dear ' . $userList->getFirstNameString() . "\r\n\r\n"
            . 'Please click here to verify your e-mail address, ' . $userList->getEMailAddressString() . ': ' . $resetPasswordUrl . "\r\n\r\n";

        //Send Contact us form data
        $messageHTML = $twig->render(
            '@ContactBundle/Email/notification.html.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageHtml,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST'],
            )
        );
        $messageText = $twig->render(
            '@ContactBundle/Email/notification.txt.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageText,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST'],
            )
        );

        $messageValues = array(
            'subject' => $subject,
            'messageHTML' => $messageHTML,
            'messageText' => $messageText,
            'contactMethod' => $contactMethod,
            'contactReason' => $contactReason,
            'messageType' => $messageType,
        );

        $messageManager->saveMessage($sender, array($userList), $messageValues);

        $return['success'] = true;

        return $return;
    }

    /**
     * Send an account verify link
     *
     * @param UserList $userList
     * @return null
     */
    public function sendWelcomeMail(UserList $userList)
    {

        $settingManager = $this->getContainer()->get('system_setting.manager');
        $messageManager = $this->getContainer()->get('contact_message.manager');

        $messageType = $this->em->getRepository(MessageType::class)->find($settingManager->getSetting('contact_message_type_sys_notif'));
        $contactMethod = $this->em->getRepository(ContactMethod::class)->find($settingManager->getSetting('contact_method_e_mail'));
        $contactReason = $this->em->getRepository(ContactReason::class)->find($settingManager->getSetting('contact_reason_type_sys_notif'));

        $sender = $messageManager->getSystemUser();
        $subject = 'Thank you for your registration on ' . $messageManager->getSystemName();
        $messageHtml = '<p>Dear ' . $userList->getFirstNameString() . '</p>'
            . '<p>Thank you for taking the time to register your profile on our web site.</p>'
            . '<p>Your username is: ' . $userList->getUsername() . '</p>';
        $messageText = 'Dear ' . $userList->getFirstNameString() . "\r\n\r\n"
            . 'Thank you for taking the time to register your profile on our web site.' . "\r\n\r\n"
            . 'Your username is: ' . $userList->getUsername() . "\r\n\r\n";

        $twig = $this->getContainer()->get('twig');

        //Send Contact us form data
        $messageHTML = $twig->render(
            '@ContactBundle/Email/notification.html.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageHtml,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST'],
            )
        );
        $messageText = $twig->render(
            '@ContactBundle/Email/notification.txt.twig',
            array(
                'sender' => $sender,
                'contactFromName' => $sender->getFullNameString(),
                'contactFromEMail' => $sender->getEMailAddressString(),
                'messageText' => $messageText,
                'hostName' => $_SERVER["HTTP_HOST"],
                'sitePath' => 'http://' . $_SERVER['HTTP_HOST'],
            )
        );

        $messageValues = array(
            'subject' => $subject,
            'messageHTML' => $messageHTML,
            'messageText' => $messageText,
            'contactMethod' => $contactMethod,
            'contactReason' => $contactReason,
            'messageType' => $messageType,
        );

        $messageManager->saveMessage($sender, array($userList), $messageValues);

        $return['success'] = true;

        return $return;
    }

    /**
     * Check a e-mail verification token
     *
     * @param string $token
     * @return UserList
     */
    public function verifyEMail($token)
    {

        $OpensslEncryption = new Openssl_EncryptDecrypt();

        $valueString = $OpensslEncryption->decrypt($token);

        $valuesCheck = explode('&', $valueString);
        $values = array();

        foreach ($valuesCheck as $valueCheck) {
            $oneValue = explode('=', $valueCheck);
            $values[$oneValue[0]] = $oneValue[1];
        }

        if ($values['time'] + (60 * 60 * 24) <= time()) {
            //token has expired
            return false;
        }

        $userList = $this->getContainer()->get('user_list.manager')->find($values['user_list_id']);

        if (is_object($userList)) {
            $userList->setIsActive(true);
            $this->save($userList);
            return true;
        }

        return false;
    }
}