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;
}