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

	$arCreatedUserId = array();

	$arEmailToRegister = array();
	$arEmailToReinvite = array();
	$arUserForTransferId = $arExtranetUserId = $arShopUserId = array();

	$arEmailExist = array();
	$bExtranetUser = false;
	$bExtranetInstalled = (
		ModuleManager::isModuleInstalled("extranet")
		&& Option::get("extranet", "extranet_site") !== ''
	);

	if (!empty($arFields["EMAIL"]) || !empty($arFields['PHONE']))
	{
		$isPhone = !empty($arFields['PHONE']) && is_array($arFields['PHONE']);
		$phoneCountryList = [];
		$arEmailOriginal = [];

		if ($isPhone)
		{
			$arEmailOriginal = $arFields['PHONE'];
			$phoneCountryList = $arFields['PHONE_COUNTRY'];
		}
		else if (!empty($arFields["EMAIL"]))
		{
			$arEmailOriginal = is_array($arFields["EMAIL"])
				? $arFields["EMAIL"] : preg_split("/[nrt\,;\ ]+/", trim($arFields["EMAIL"]));
		}

		$arEmail = $errorEmails = array();
		$emailCnt = 0;

		foreach ($arEmailOriginal as $index => $addr)
		{
			if ($emailCnt >= ($isPhone ? 5 : 100))
			{
				$arError = [
					$isPhone
						? Loc::getMessage("BX24_INVITE_DIALOG_PHONE_LIMIT_EXCEEDED")
						: Loc::getMessage("BX24_INVITE_DIALOG_EMAIL_LIMIT_EXCEEDED")
				];
				return false;
			}

			if($isPhone)
			{
				$phoneCountry = $phoneCountryList[$index] ?? '';
				$phoneNumber = BitrixMainPhoneNumberParser::getInstance()->parse($addr, $phoneCountry);
				if($phoneNumber->isValid())
				{
					$arEmail[] = $phoneNumber->format(BitrixMainPhoneNumberFormat::E164);
					$emailCnt++;
				}
				else
				{
					$errorEmails[] = $addr;
				}
			}
			else
			{
				if ((string)$addr !== '' && check_email($addr))
				{
					$arEmail[] = $addr;
					$emailCnt++;
				}
				else
				{
					$errorEmails[] = htmlspecialcharsbx($addr);
				}
			}
		}

		if (count($arEmailOriginal) > count($arEmail))
		{
			$arError = [
				(
					$isPhone
						? Loc::getMessage("BX24_INVITE_DIALOG_PHONE_ERROR")
						: Loc::getMessage("BX24_INVITE_DIALOG_EMAIL_ERROR")
				) . ": " . implode(", ", $errorEmails)
			];
			return false;
		}

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

		foreach($arEmail as $email)
		{
			if ($isPhone)
			{
				$filter = array(
					"=PHONE_NUMBER" => $email
				);

				if (!empty($externalAuthIdList))
				{
					$filter['!@USER.EXTERNAL_AUTH_ID'] = $externalAuthIdList;
				}

				$rsUser = BitrixMainUserPhoneAuthTable::getList(array(
					'filter' => $filter,
					'select' => array("USER_ID", "USER_CONFIRM_CODE" => "USER.CONFIRM_CODE", "USER_EXTERNAL_AUTH_ID" => "USER.EXTERNAL_AUTH_ID", "USER_UF_DEPARTMENT" => "USER.UF_DEPARTMENT")
				));
			}
			else
			{
				$filter = array(
					"=EMAIL" => $email
				);

				if (!empty($externalAuthIdList))
				{
					$filter['!@EXTERNAL_AUTH_ID'] = $externalAuthIdList;
				}

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

			$bFound = false;
			while ($arUser = $rsUser->Fetch())
			{
				if($isPhone)
				{
					$arUser = array(
						'ID' => $arUser["USER_ID"],
						'CONFIRM_CODE' => $arUser["USER_CONFIRM_CODE"],
						'EXTERNAL_AUTH_ID' => $arUser["USER_ID"],
						'UF_DEPARTMENT' => $arUser["USER_UF_DEPARTMENT"],
					);
				}

				$bFound = true;

				if ($arUser["EXTERNAL_AUTH_ID"] === 'email' || $arUser["EXTERNAL_AUTH_ID"] === 'shop')
				{
					$arUserForTransferId[] = $arUser["ID"];
					if ($arUser["EXTERNAL_AUTH_ID"] === 'shop')
					{
						$arShopUserId[] = $arUser["ID"];
					}
				}
				elseif (
					(string)$arUser["CONFIRM_CODE"] !== ""
					&& (
						!$bExtranetInstalled
						|| ( // both intranet
							isset($arFields["DEPARTMENT_ID"], $arUser["UF_DEPARTMENT"])
							&& (int)$arFields["DEPARTMENT_ID"] > 0
							&& (
								(
									is_array($arUser["UF_DEPARTMENT"])
									&& (int)$arUser["UF_DEPARTMENT"][0] > 0
								)
								|| (
									!is_array($arUser["UF_DEPARTMENT"])
									&& (int)$arUser["UF_DEPARTMENT"] > 0
								)
							)
						)
						||
						(	// both extranet
							(
								!isset($arFields["DEPARTMENT_ID"])
								|| (int)$arFields["DEPARTMENT_ID"] <= 0
							)
							&& (
								!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
								)
							)
						)
					)
				)
				{
					$arEmailToReinvite[] = array(
						"EMAIL" => $email,
						"REINVITE" => true,
						"ID" => $arUser["ID"],
						"CONFIRM_CODE" => $arUser["CONFIRM_CODE"],
						"UF_DEPARTMENT" => $arUser["UF_DEPARTMENT"]
					);
				}
				elseif (
					$arUser["EXTERNAL_AUTH_ID"] === 'socservices'
					&& (
						isset($arFields["DEPARTMENT_ID"])
						&& (int)$arFields["DEPARTMENT_ID"] > 0
					)
					&& (
						!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
						)
					) // past-extranet to intranet
					&& ModuleManager::isModuleInstalled('bitrix24')
					&& !ModuleManager::isModuleInstalled('extranet')
				)
				{
					$arExtranetUserId[] = $arUser["ID"];
				}
				else
				{
					$arEmailExist[] = $email;
				}
			}

			if (!$bFound)
			{
				$arEmailToRegister[] = array(
					"EMAIL" => $email,
					"REINVITE" => false
				);
			}
		}
	}

	if(!$isPhone)
	{
		if(
			isset($arFields["MESSAGE_TEXT"])
			&& (
				!Loader::includeModule('bitrix24')
				|| (
					CBitrix24::IsLicensePaid()
					&& !CBitrix24::IsDemoLicense()
				)
				|| CBitrix24::IsNfrLicense()
			)
		)
		{
			$messageText = $arFields["MESSAGE_TEXT"];
			CUserOptions::SetOption((IsModuleInstalled("bitrix24") ? "bitrix24" : "intranet"), "invite_message_text", $arFields["MESSAGE_TEXT"]);
		}
		else
		{
			$messageText = Loc::getMessage("BX24_INVITE_DIALOG_INVITE_MESSAGE_TEXT_1");
		}

		if(
			empty($arEmailToRegister)
			&& empty($arEmailToReinvite)
			&& empty($arUserForTransferId)
			&& empty($arExtranetUserId)
		)
		{
			$arError = array(
				(
				!empty($arEmailExist)
					? (
						count($arEmailExist) > 1
							? Loc::getMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR2", [
								"#EMAIL_LIST#" => implode(', ', $arEmailExist)
							])
							: Loc::getMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR1", [
								"#EMAIL#" => $arEmailExist[0]
							])
				)
					: Loc::getMessage("BX24_INVITE_DIALOG_ERROR_EMPTY_EMAIL_LIST")
				)
			);

			return false;
		}

		//reinvite users
		foreach($arEmailToReinvite as $userData)
		{
			self::InviteUser($userData, $messageText, array('checkB24' => false));
		}
	}
	else
	{
		// TODO: reinvite: self::InviteUserByPhone($userData)
	}

	$siteIdByDepartmentId = $arGroups = false;

	if (
		!empty($arEmailToRegister)
		|| !empty($arUserForTransferId)
		|| !empty($arExtranetUserId)
	)
	{
		if (isset($arFields["DEPARTMENT_ID"]))
		{
			$arFields["UF_DEPARTMENT"] = $arFields["DEPARTMENT_ID"];
		}

		if (
			!(
				isset($arFields["UF_DEPARTMENT"])
				//&& intval($arFields["UF_DEPARTMENT"]) > 0
			)
		)
		{
			if (!$bExtranetInstalled)
			{
				if (Loader::includeModule('iblock'))
				{
					$rsIBlock = CIBlock::GetList(array(), array("CODE" => "departments"));
					$arIBlock = $rsIBlock->Fetch();
					$iblockID = $arIBlock["ID"];

					$db_up_department = CIBlockSection::GetList(
						array(),
						array(
							"SECTION_ID" => 0,
							"IBLOCK_ID" => $iblockID
						)
					);
					if ($ar_up_department = $db_up_department->Fetch())
					{
						$arFields["UF_DEPARTMENT"] = [$ar_up_department['ID']];
					}
				}
			}
			else
			{
				$bExtranetUser = true;
			}
		}

		$siteIdByDepartmentId = self::getUserSiteId(array(
			"UF_DEPARTMENT" => (!$bExtranetUser ? $arFields["UF_DEPARTMENT"] : false),
			"SITE_ID" => $SITE_ID
		));

		$arGroups = self::getUserGroups($siteIdByDepartmentId, $bExtranetUser);
	}

	// transfer email or shop users to employees or extranet
	if (!empty($arUserForTransferId))
	{
		$arShopGroups = $arGroups;
		if (Loader::includeModule("crm"))
		{
			$arShopGroups[] = BitrixCrmOrderBuyerGroup::getSystemGroupId();
		}

		foreach ($arUserForTransferId as $transferUserId)
		{
			$ID_TRANSFERRED = self::TransferEmailUser($transferUserId, array(
				"GROUP_ID" => (in_array($transferUserId, $arShopUserId)) ? $arShopGroups : $arGroups,
				"UF_DEPARTMENT" => $arFields["UF_DEPARTMENT"],
				"SITE_ID" => $siteIdByDepartmentId
			));

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

			$arCreatedUserId[] = $ID_TRANSFERRED;
		}
	}

	// transfer past-extranet users to employees
	if (!empty($arExtranetUserId))
	{
		foreach ($arExtranetUserId as $extranetUserId)
		{
			$ID_TRANSFERRED = self::TransferExtranetUser($extranetUserId, array(
				"GROUP_ID" => $arGroups,
				"UF_DEPARTMENT" => $arFields["UF_DEPARTMENT"],
				"SITE_ID" => $siteIdByDepartmentId
			));

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

			$arCreatedUserId[] = $ID_TRANSFERRED;
		}
	}

	//register users
	if (!empty($arEmailToRegister))
	{
		$invitedUserIdList = [];
		foreach ($arEmailToRegister as $userData)
		{
			if($isPhone)
			{
				$userData['LOGIN'] = $userData['EMAIL'];
				$userData['PHONE_NUMBER'] = $userData['EMAIL'];

				unset($userData['EMAIL']);
			}

			$userData["CONFIRM_CODE"] = Random::getString(8, true);
			$userData["GROUP_ID"] = $arGroups;
			$userData["UF_DEPARTMENT"] = $arFields["UF_DEPARTMENT"];
			$ID = self::RegisterUser($userData, $siteIdByDepartmentId);

			if(is_array($ID))
			{
				$arError = $ID;
				return false;
			}

			$arCreatedUserId[] = $ID;
			$invitedUserIdList[] = $ID;
			$userData['ID'] = $ID;

			if(!$isPhone)
			{
				self::InviteUser($userData, $messageText, array('checkB24' => false));
			}
			else
			{
				//TODO: invite user self::InviteUserByPhone($userData);
			}
		}

		if (!empty($invitedUserIdList))
		{
			Invitation::add([
				'USER_ID' => $invitedUserIdList,
				'TYPE' => ($isPhone ? Invitation::TYPE_PHONE : Invitation::TYPE_EMAIL)
			]);
		}
	}

	if (!empty($arEmailExist))
	{
		if($isPhone)
		{
			$arError = [
				count($arEmailExist) > 1
					? Loc::getMessage("BX24_INVITE_DIALOG_USER_PHONE_EXIST_ERROR2", [
						"#PHONE_LIST#" => implode(', ', $arEmailExist),
					])
					: Loc::getMessage("BX24_INVITE_DIALOG_USER_PHONE_EXIST_ERROR1", [
						"#PHONE#" => $arEmailExist[0],
					])
			];
		}
		else
		{
			$arError = array(
				count($arEmailExist) > 1
					? Loc::getMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR2", [
						"#EMAIL_LIST#" => implode(', ', $arEmailExist),
					])
					: Loc::getMessage("BX24_INVITE_DIALOG_USER_EXIST_ERROR1", [
						"#EMAIL#" => $arEmailExist[0],
					])
			);
		}

		return false;
	}

	return $arCreatedUserId;
}