• Модуль: intranet
  • Путь к файлу: ~/bitrix/modules/intranet/classes/general/invite_dialog.php
  • Класс: CIntranetInviteDialog
  • Вызов: CIntranetInviteDialog::AddNewUser
static function AddNewUser($SITE_ID, $arFields, &$strError)
{
	global $APPLICATION, $USER;

	$ID_ADDED = 0;

	$bitrix24Installed = ModuleManager::isModuleInstalled('bitrix24');

	if (
		isset($arFields["DEPARTMENT_ID"])
		&& !is_array($arFields["DEPARTMENT_ID"])
		&& (int)$arFields["DEPARTMENT_ID"] > 0
	)
	{
		$arFields["DEPARTMENT_ID"] = [ $arFields["DEPARTMENT_ID"] ];
	}

	$siteIdByDepartmentId = self::getUserSiteId(array(
		"UF_DEPARTMENT" => isset($arFields["DEPARTMENT_ID"]) && is_array($arFields["DEPARTMENT_ID"])
			? $arFields["DEPARTMENT_ID"][0] : "",
		"SITE_ID" => $SITE_ID
	));

	$bExtranet = !isset($arFields["DEPARTMENT_ID"]);
	$arGroups = self::getUserGroups($siteIdByDepartmentId, $bExtranet);

	$strEmail = trim($arFields["ADD_EMAIL"]);
	$strName = trim($arFields["ADD_NAME"]);
	$strLastName = trim($arFields["ADD_LAST_NAME"]);
	$strPosition = trim($arFields["ADD_POSITION"]);

	if ($strEmail !== '')
	{
		$filter = array(
			"=EMAIL"=> $strEmail
		);

		if (Loader::includeModule('socialnetwork'))
		{
			$externalAuthIdList = SocialnetworkComponentHelper::checkPredefinedAuthIdList(array_diff(BitrixMainUserTable::getExternalUserTypes(), [ 'email', 'shop' ]));
			if (!empty($externalAuthIdList))
			{
				$filter['!@EXTERNAL_AUTH_ID'] = $externalAuthIdList;
			}
		}

		$rsUser = UserTable::getList(array(
			'filter' => $filter,
			'select' => array("ID", "EXTERNAL_AUTH_ID", "UF_DEPARTMENT")
		));

		if ($arUser = $rsUser->Fetch())
		{
			if ($arUser["EXTERNAL_AUTH_ID"] === 'email' || $arUser["EXTERNAL_AUTH_ID"] === 'shop')
			{
				if ($arUser["EXTERNAL_AUTH_ID"] === 'shop' && Loader::includeModule("crm"))
				{
					$arGroups[] = BitrixCrmOrderBuyerGroup::getSystemGroupId();
				}

				$ID_TRANSFERRED = self::TransferEmailUser($arUser["ID"], array(
					"GROUP_ID" => $arGroups,
					"UF_DEPARTMENT" => $arFields["DEPARTMENT_ID"],
					"SITE_ID" => $siteIdByDepartmentId,
					"NAME" => $strName,
					"LAST_NAME" => $strLastName,
					"POSITION" => $strPosition
				));

				if (!$ID_TRANSFERRED)
				{
					if($e = $APPLICATION->GetException())
					{
						$strError = $e->GetString();
					}
					return false;
				}

				return $ID_TRANSFERRED;
			}

			if (
				$bitrix24Installed
				&& $arUser["EXTERNAL_AUTH_ID"] === 'socservices'
				&& !empty($arFields["DEPARTMENT_ID"])
				&& (
					!isset($arUser["UF_DEPARTMENT"])
					|| (
						is_array($arUser["UF_DEPARTMENT"])
						&& (int)$arUser["UF_DEPARTMENT"][0] <= 0
					)
					|| (
						!is_array($arUser["UF_DEPARTMENT"])
						&& (int)$arUser["UF_DEPARTMENT"] <= 0
					)
				)
				&& !ModuleManager::isModuleInstalled('extranet')
			)
			{
				$ID_TRANSFERRED = self::TransferExtranetUser($arUser["ID"], array(
					"GROUP_ID" => $arGroups,
					"UF_DEPARTMENT" => $arFields["DEPARTMENT_ID"],
					"SITE_ID" => $siteIdByDepartmentId
				));

				if (!$ID_TRANSFERRED)
				{
					if($e = $APPLICATION->GetException())
					{
						$strError = $e->GetString();
					}
					return false;
				}

				return $ID_TRANSFERRED;
			}

			$strError = Loc::getMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR1", [
				'#EMAIL#' => $strEmail,
			]);
		}
	}

	if ($strEmail === '')
	{
		if (
			!isset($arFields["ADD_MAILBOX_ACTION"])
			|| (string)$arFields['ADD_MAILBOX_USER'] === ''
			|| (string)$arFields['ADD_MAILBOX_DOMAIN'] === ''
			|| !in_array($arFields["ADD_MAILBOX_ACTION"], array("create", "connect"))
		)
		{
			$strError = Loc::getMessage("BX24_INVITE_DIALOG_ERROR_EMPTY_EMAIL");
		}
		else
		{
			// email from mailbox
			$strEmail = $arFields['ADD_MAILBOX_USER']."@".$arFields['ADD_MAILBOX_DOMAIN'];
		}
	}

	if (!$strError)
	{
		$strPassword = self::GeneratePassword($siteIdByDepartmentId, $bExtranet);
		self::setSendPassword($arFields["ADD_SEND_PASSWORD"] === "Y");
		$site = CSite::GetByID($siteIdByDepartmentId)->Fetch();

		$arUser = [
			'LOGIN' => $strEmail,
			'NAME' => $strName,
			'LAST_NAME' => $strLastName,
			'EMAIL' => $strEmail,
			'PASSWORD' => $strPassword,
			'GROUP_ID' => $arGroups,
			'WORK_POSITION' => $strPosition,
			'LID' => $siteIdByDepartmentId,
			'LANGUAGE_ID' => $site['LANGUAGE_ID'],
			'UF_DEPARTMENT' => $arFields['DEPARTMENT_ID'],
		];

		if (!self::getSendPassword())
		{
			$arUser["CONFIRM_CODE"] = Random::getString(8, true);
		}
		else
		{
			$arUser["B24NETWORK_CHECKWORD"] = Random::getString(16, true);
		}

		$obUser = new CUser;
		$ID_ADDED = $obUser->Add($arUser);

		if (!$ID_ADDED)
		{
			if($e = $APPLICATION->GetException())
			{
				$strError = $e->GetString();
			}
			else
			{
				$strError = $obUser->LAST_ERROR;
			}
		}
		else
		{
			$userFields = $arUser;
			$userFields['ID'] = $ID_ADDED;
			foreach(GetModuleEvents("intranet", "OnRegisterUser", true) as $arEvent)
			{
				ExecuteModuleEventEx($arEvent, [ $userFields ]);
			}

			if (self::getSendPassword())
			{
				$db_events = GetModuleEvents("main", "OnUserInitialize", true);
				foreach($db_events as $arEvent)
				{
					ExecuteModuleEventEx($arEvent, array($ID_ADDED, $arUser));
				}

				$event = new Event(
					'intranet',
					'onUserAdded',
					[
						'originatorId' => $USER->getId(),
						'userId' => [ $ID_ADDED ],
						'type' => Invitation::TYPE_EMAIL
					]
				);
				$event->send();
			}
			else
			{
				Invitation::add([
					'USER_ID' => $ID_ADDED,
					'TYPE' => Invitation::TYPE_EMAIL
				]);
			}

			if (
				$bExtranet
				&& !$bitrix24Installed
				&& !ModuleManager::isModuleInstalled('extranet')
			)
			{
				$bExtranet = false;
			}

			$messageText = self::getInviteMessageText();

			if (self::getSendPassword())
			{
				$serverName = (
					(string)$site["SERVER_NAME"] !== ''
						? $site["SERVER_NAME"]
						: (
							defined("SITE_SERVER_NAME") && SITE_SERVER_NAME !== ''
								? SITE_SERVER_NAME
								: Option::get('main', 'server_name')
						)
				);

				if ($bitrix24Installed && Loader::includeModule('socialservices'))
				{
					$b24NetworkTransport = new CBitrix24NetOAuthInterface();
					$uri = new BitrixMainWebUri(defined('B24NETWORK_NODE') ? B24NETWORK_NODE : 'https://www.bitrix24.net');

					$uri->setPath('/invite/');
					$uri->addParams([
						'user_lang' => LANGUAGE_ID,
						'client_id' => $b24NetworkTransport->getAppID(),
						'profile_id' => $ID_ADDED,
						'checkword' => $arUser["B24NETWORK_CHECKWORD"],
						'accepted' => 'yes'
					]);
					$url = $uri->getLocator();
				}
				else
				{
					$url = (CMain::IsHTTPS() ? "https" : "http") . "://" . $serverName . $site["DIR"];
				}
				CEvent::SendImmediate(
					$bitrix24Installed ? "BITRIX24_USER_ADD" : "INTRANET_USER_ADD",
					$siteIdByDepartmentId,
					array(
						"EMAIL_TO" => $arUser["EMAIL"],
						"LINK" => $url,
						"USER_ID_FROM" => $USER->GetID(),
						"PASSWORD" => $strPassword,
						"USER_TEXT" => $messageText
					)
				);
			}
			else
			{
				$dbUser = CUser::GetByID($ID_ADDED);
				$arUser = $dbUser->Fetch();

				if ($bExtranet)
				{
					CEvent::SendImmediate("EXTRANET_INVITATION", $siteIdByDepartmentId, array(
						"USER_ID" => $arUser["ID"],
						"CHECKWORD" => $arUser["CONFIRM_CODE"],
						"EMAIL" => $arUser["EMAIL"],
						"USER_TEXT" => ''
					));
				}
				elseif ($bitrix24Installed)
				{
					CEvent::SendImmediate("BITRIX24_USER_INVITATION", $siteIdByDepartmentId, array(
						"EMAIL_FROM" => $USER->GetEmail(),
						"USER_ID_FROM" => $USER->GetID(),
						"EMAIL_TO" => $arUser["EMAIL"],
						"LINK" => self::getInviteLink($arUser, $siteIdByDepartmentId),
						"USER_TEXT" => $messageText
					));
				}
				else
				{
					CEvent::SendImmediate("INTRANET_USER_INVITATION", $siteIdByDepartmentId, array(
						"USER_ID_FROM" => $USER->GetID(),
						"EMAIL_TO" => $arUser["EMAIL"],
						"LINK" => self::getInviteLink($arUser, $siteIdByDepartmentId),
						"USER_TEXT" => $messageText
					));
				}
			}
		}
	}

	return $ID_ADDED;
}