/**
  * Add User in the time of adding a customer based on the account settings
  *
  * @param String  $email            user email id
  * @param String  $password         user password
  * @param Boolean $sendLoginDetails status
  *
  * @return boolean
  */
 function addUser($email, $password, $sendLoginDetails = false, $result = array(), $id)
 {
     global $objDatabase, $_CORELANG, $_ARRAYLANG;
     $settings = $this->getSettings();
     if (!isset($this->contact)) {
         $this->contact = new \Cx\Modules\Crm\Model\Entity\CrmContact();
     }
     $objFWUser = \FWUser::getFWUserObject();
     $modify = isset($this->contact->id) && !empty($this->contact->id);
     $accountId = 0;
     if (!empty($id)) {
         $objUsers = $objFWUser->objUser->getUsers($filter = array('id' => intval($id)));
         if ($objUsers) {
             $accountId = $objUsers->getId();
             $email = $objUsers->getEmail();
         }
     } else {
         if (empty($id)) {
             $objUsers = $objFWUser->objUser->getUsers($filter = array('email' => addslashes($email)));
             if ($objUsers) {
                 $accountId = $objUsers->getId();
             }
         }
     }
     if ($modify) {
         $useralExists = $objDatabase->SelectLimit("SELECT id FROM `" . DBPREFIX . "module_{$this->moduleNameLC}_contacts` WHERE user_account = {$accountId}", 1);
         if ($useralExists && !empty($useralExists->fields['id']) && !empty($accountId) && intval($useralExists->fields['id']) != $this->contact->id) {
             $existId = (int) $useralExists->fields['id'];
             $custDetails = $this->getExistCrmDetail($existId);
             $existLink = "<a href='index.php?cmd=" . $this->moduleName . "&act=customers&tpl=showcustdetail&id={$existId}' target='_blank'>{$custDetails['customer_name']} {$custDetails['contact_familyname']}</a>";
             $this->_strErrMessage = sprintf($_ARRAYLANG['TXT_CRM_CONTACT_ALREADY_EXIST_ERROR'], $existLink);
             return false;
         }
         $this->contact->account_id = $objDatabase->getOne("SELECT user_account FROM `" . DBPREFIX . "module_{$this->moduleNameLC}_contacts` WHERE id = {$this->contact->id}");
         if (empty($this->contact->account_id) && !empty($accountId)) {
             $objUser = $objFWUser->objUser->getUser($accountId);
             //            $objUser = new \User($accountId);
         } elseif ((!empty($this->contact->account_id) && ($objUser = $objFWUser->objUser->getUser($this->contact->account_id))) === false) {
             if (!empty($accountId)) {
                 $objUser = $objFWUser->objUser->getUser($accountId);
             } else {
                 $objUser = new \User();
                 $objUser->setPassword($password);
             }
         } elseif (!empty($accountId) && $useralExists && $useralExists->RecordCount() == 0) {
             $objUser = $objFWUser->objUser->getUser($accountId);
         } else {
             if ((!empty($this->contact->account_id) && ($objUser = $objFWUser->objUser->getUser($this->contact->account_id))) === true) {
                 if (empty($accountId)) {
                     $objUser = new \User();
                     $objUser->setPassword($password);
                 } else {
                     $objUser = $objFWUser->objUser->getUser($this->contact->account_id);
                 }
             } else {
                 if (empty($this->contact->account_id) && empty($accountId)) {
                     $objUser = new \User();
                     $objUser->setPassword($password);
                 }
             }
         }
     } else {
         if (empty($accountId)) {
             $objUser = new \User();
             $objUser->setPassword($password);
         } else {
             $userExists = $objDatabase->getOne("SELECT id FROM `" . DBPREFIX . "module_{$this->moduleNameLC}_contacts` WHERE user_account = {$accountId}");
             if (empty($userExists)) {
                 $objUser = $objFWUser->objUser->getUser($accountId);
             } else {
                 $custDetails = $this->getExistCrmDetail($userExists);
                 $existLink = "<a href='index.php?cmd=" . $this->moduleName . "&act=customers&tpl=showcustdetail&id={$userExists}' target='_blank'>{$custDetails['customer_name']} {$custDetails['contact_familyname']}</a>";
                 $this->_strErrMessage = sprintf($_ARRAYLANG['TXT_CRM_CONTACT_ALREADY_EXIST_ERROR'], $existLink);
                 return false;
             }
         }
     }
     //update/insert additional fields
     //company
     if (!empty($result['company'])) {
         $company = $objDatabase->getOne("SELECT customer_name FROM `" . DBPREFIX . "module_{$this->moduleNameLC}_contacts` WHERE id = '" . $result['company'] . "'");
     }
     //get default website
     foreach ($result['contactwebsite'] as $value) {
         if (!empty($value['value']) && $value['primary'] == '1') {
             $website = contrexx_raw2db($value['value']);
         }
     }
     //get default phone
     foreach ($result['contactphone'] as $value) {
         if (!empty($value['value']) && $value['primary'] == '1') {
             $phone = contrexx_input2db($value['value']);
         }
     }
     //get default address
     foreach ($result['contactAddress'] as $value) {
         if ((!empty($value['address']) || !empty($value['city']) || !empty($value['state']) || !empty($value['zip']) || !empty($value['country'])) && $value['primary'] == '1') {
             $address = contrexx_input2db($value['address']);
             $city = contrexx_input2db($value['city']);
             $zip = contrexx_input2db($value['zip']);
             $country = \Cx\Core\Country\Controller\Country::getByName($value['country']);
         }
     }
     $gender = $this->contact->contact_gender == 1 ? 'gender_female' : ($this->contact->contact_gender == 2 ? 'gender_male' : 'gender_undefined');
     $setProfileData = array('firstname' => array(0 => $this->contact->customerName), 'lastname' => array(0 => $this->contact->family_name), 'gender' => array(0 => $gender), 'website' => array(0 => $website), 'company' => array(0 => $company), 'phone_office' => array(0 => $phone), 'address' => array(0 => $address), 'city' => array(0 => $city), 'zip' => array(0 => $zip), 'country' => array(0 => $country['id']));
     //set profile picture
     $picture = $objDatabase->getOne("SELECT profile_picture FROM `" . DBPREFIX . "module_{$this->moduleNameLC}_contacts` WHERE id = '" . $this->contact->id . "'");
     $cx = \Cx\Core\Core\Controller\Cx::instanciate();
     if ($picture && !empty($picture)) {
         if (!file_exists($cx->getWebsiteImagesAccessProfilePath() . '/' . $picture)) {
             $file = $cx->getWebsiteImagesCrmProfilePath() . '/';
             if (($picture = self::moveUploadedImageInToPlace($objUser, $file . $picture, $picture, true)) == true) {
                 // create thumbnail
                 if (self::createThumbnailOfImage($picture, true) !== false) {
                     $setProfileData['picture'] = array();
                     array_push($setProfileData['picture'], $picture);
                 }
             }
         }
     }
     //set group ids
     $defaultUserGroup = $settings['default_user_group'];
     $groups = $objUser->getAssociatedGroupIds();
     if (!empty($defaultUserGroup) && !in_array($defaultUserGroup, $groups)) {
         array_push($groups, $defaultUserGroup);
     }
     $objUser->setGroups($groups);
     $objUser->setUsername($email);
     $objUser->setEmail($email);
     $objUser->setFrontendLanguage($result['contact_language']);
     $objUser->setBackendLanguage($settings['customer_default_language_backend']);
     $objUser->setActiveStatus(true);
     $objUser->setProfile($setProfileData);
     if (empty($objUser->error_msg) && $objUser->store()) {
         if (empty($this->contact->account_id) && $sendLoginDetails) {
             if (trim($objUser->getProfileAttribute('gender')) == 'gender_female') {
                 $saluation = $_ARRAYLANG['TXT_CRM_SALUATION_FEMALE'];
             } else {
                 if (trim($objUser->getProfileAttribute('gender')) == 'gender_male') {
                     $saluation = $_ARRAYLANG['TXT_CRM_SALUATION_MALE'];
                 } else {
                     $saluation = $_ARRAYLANG['TXT_CRM_SALUATION'];
                 }
             }
             $info['substitution'] = array('CRM_CONTACT_FIRSTNAME' => contrexx_raw2xhtml($objUser->getProfileAttribute('firstname')), 'CRM_CONTACT_LASTNAME' => contrexx_raw2xhtml($objUser->getProfileAttribute('lastname')), 'CRM_ASSIGNED_USER_EMAIL' => $objUser->getEmail(), 'CRM_CONTACT_SALUTATION' => contrexx_raw2xhtml($saluation), 'CRM_ASSIGNED_USER_NAME' => contrexx_raw2xhtml(\FWUser::getParsedUserTitle($objUser->getId())), 'CRM_CUSTOMER_COMPANY' => $this->contact->customerName . " " . $this->contact->family_name, 'CRM_DOMAIN' => ASCMS_PROTOCOL . "://{$_SERVER['HTTP_HOST']}" . $cx->getCodeBaseOffsetPath(), 'CRM_CONTACT_EMAIL' => $email, 'CRM_CONTACT_USERNAME' => $email, 'CRM_CONTACT_PASSWORD' => $password);
             //setting email template lang id
             $availableMailTempLangAry = $this->getActiveEmailTemLangId('Crm', CRM_EVENT_ON_USER_ACCOUNT_CREATED);
             $availableLangId = $this->getEmailTempLang($availableMailTempLangAry, $email);
             $info['lang_id'] = $availableLangId;
             $dispatcher = CrmEventDispatcher::getInstance();
             $dispatcher->triggerEvent(CRM_EVENT_ON_USER_ACCOUNT_CREATED, null, $info);
         }
         $this->contact->account_id = $objUser->getId();
         return true;
     } else {
         $objUser->reset();
         $this->_strErrMessage = implode("<br />", $objUser->error_msg);
         return false;
     }
     $this->_strErrMessage = 'Some thing went wrong';
     return false;
 }