Your IP : 3.128.28.117


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/intranet.invitation/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/intranet.invitation/ajax.php

<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();

use Bitrix\Main\Loader;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\Localization\Loc;
use Bitrix\Bitrix24\Integrator;
use Bitrix\Intranet\Invitation;
use Bitrix\Main\Config\Option;
use Bitrix\Socialnetwork\Integration\UI\EntitySelector;
use Bitrix\Main\HttpResponse;
use Bitrix\Main\Text\Encoding;
use Bitrix\Main\Web\Json;
use Bitrix\Main\Engine\ActionFilter;

class CIntranetInvitationComponentAjaxController extends \Bitrix\Main\Engine\Controller
{
	protected function isInvitingUsersAllowed()
	{
		return Invitation::canCurrentUserInvite();
	}

	public function configureActions()
	{
		return [
			'getSliderContent' => [
				'-prefilters' => [
					ActionFilter\Csrf::class,
				],
			],
		];
	}

	public function getSliderContentAction(string $componentParams = '')
	{
		$params =
			$componentParams
				? Json::decode(Encoding::convertEncoding($componentParams, SITE_CHARSET, 'UTF-8'))
				: []
		;

		$content = $GLOBALS['APPLICATION']->includeComponent(
			'bitrix:ui.sidepanel.wrapper',
			'',
			[
				'RETURN_CONTENT' => true,
				'POPUP_COMPONENT_NAME' => 'bitrix:intranet.invitation',
				'POPUP_COMPONENT_TEMPLATE_NAME' => '',
				'POPUP_COMPONENT_PARAMS' => [
					'USER_OPTIONS' => isset($params['USER_OPTIONS']) ? $params['USER_OPTIONS'] : []
				],
				'IFRAME_MODE' => true
			]
		);

		$response = new HttpResponse();
		$response->setContent($content);

		return $response;
	}

	protected function isExtranetInstalled()
	{
		$bExtranetInstalled = ModuleManager::IsModuleInstalled("extranet");
		if ($bExtranetInstalled)
		{
			$extranetSiteId = Option::get("extranet", "extranet_site");
			if (empty($extranetSiteId))
			{
				$bExtranetInstalled = false;
			}
		}

		return $bExtranetInstalled;
	}

	protected function isInvitationBySmsAvailable()
	{
		return Loader::includeModule("bitrix24") && Option::get('bitrix24', 'phone_invite_allowed', 'N') === 'Y';
	}

	protected function isMoreUserAvailable()
	{
		if (Loader::includeModule("bitrix24") && !CBitrix24::isMoreUserAvailable())
		{
			return false;
		}

		return true;
	}

	protected function getHeadDepartmentId()
	{
		if (Loader::includeModule('iblock'))
		{
			$rsIBlock = CIBlock::GetList(array(), array("CODE" => "departments"));
			$arIBlock = $rsIBlock->Fetch();
			$iblockID = $arIBlock["ID"];

			$dbUpDepartment = CIBlockSection::GetList(
				array(),
				array(
					"SECTION_ID" => 0,
					"IBLOCK_ID" => $iblockID
				)
			);
			if ($upDepartment = $dbUpDepartment->Fetch())
			{
				return $upDepartment['ID'];
			}
		}

		return false;
	}

	protected function prepareUsersForResponse($userIds)
	{
		if (!Loader::includeModule("socialnetwork"))
		{
			return [];
		}

		$userOptions = isset($_POST["userOptions"]) && is_array($_POST["userOptions"]) ? $_POST["userOptions"] : [];
		$users = EntitySelector\UserProvider::makeItems(EntitySelector\UserProvider::getUsers(['userId' => $userIds]), $userOptions);
		return $users;
	}

	protected function registerNewUser($newUsers, &$strError)
	{
		$arError = [];
		$invitedUserIds = \Bitrix\Intranet\Invitation\Register::inviteNewUsers(SITE_ID, $newUsers, $arError);

		if(
			is_array($arError)
			&& count($arError) > 0
		)
		{
			foreach($arError as $strErrorText)
			{
				if(strlen($strErrorText) > 0)
				{
					$strError .= $strErrorText." ";
				}
			}
		}
		else
		{
			$isExtranet = isset($newUsers["UF_DEPARTMENT"]) ? false : true;
			if (isset($newUsers["SONET_GROUPS_CODE"]) && is_array($newUsers["SONET_GROUPS_CODE"]))
			{
				CIntranetInviteDialog::RequestToSonetGroups($invitedUserIds, $newUsers["SONET_GROUPS_CODE"], "", $isExtranet);
			}

			$type = $isExtranet ? 'extranet' : 'intranet';
			CIntranetInviteDialog::logAction($invitedUserIds, $type, 'invite_user', 'invite_dialog');
		}

		return $this->prepareUsersForResponse($invitedUserIds);
	}

	public function inviteAction()
	{
		if (!$this->isInvitingUsersAllowed())
		{
			return false;
		}

		if (!$this->isMoreUserAvailable())
		{
			$this->addError(new \Bitrix\Main\Error("User limit"));
			return "user_limit";
		}

		$departmentId = $this->getHeadDepartmentId();
		$strError = "";
		$items = $_POST["ITEMS"];

		foreach ($items as $key => $item)
		{
			$items[$key]["UF_DEPARTMENT"] = [$departmentId];
		}

		$newUsers = [
			"ITEMS" => $items
		];

		$res = $this->registerNewUser($newUsers, $strError);

		if (!empty($strError))
		{
			$this->addError(new \Bitrix\Main\Error($strError));
			return false;
		}

		return $res;
	}

	public function inviteWithGroupDpAction()
	{
		if (!$this->isInvitingUsersAllowed())
		{
			return false;
		}

		if (!$this->isMoreUserAvailable())
		{
			$this->addError(new \Bitrix\Main\Error("User limit"));
			return "user_limit";
		}

		$userData = $_POST;

		if (!isset($userData["UF_DEPARTMENT"]) || empty($userData["UF_DEPARTMENT"]))
		{
			$departmentId = [$this->getHeadDepartmentId()];
		}
		else
		{
			$departmentId = $userData["UF_DEPARTMENT"];
		}

		foreach ($userData["ITEMS"] as $key => $item)
		{
			$userData["ITEMS"][$key]["UF_DEPARTMENT"] = $departmentId;
		}

		$newUsers = [
			"ITEMS" => $userData["ITEMS"],
			"UF_DEPARTMENT" => $departmentId,
			"SONET_GROUPS_CODE" => isset($userData["SONET_GROUPS_CODE"]) ? $userData["SONET_GROUPS_CODE"] : []
		];

		$res = $this->registerNewUser($newUsers, $strError);

		if (!empty($strError))
		{
			$this->addError(new \Bitrix\Main\Error($strError));
			return false;
		}

		return $res;
	}

	public function massInviteAction()
	{
		if (!$this->isInvitingUsersAllowed())
		{
			return false;
		}

		$strError = "";
		$errorFormatItems = [];
		$newUsers = [];
		$departmentId = $this->getHeadDepartmentId();
		$isInvitationBySmsAvailable = $this->isInvitationBySmsAvailable();

		$data = preg_split("/[\n\r\t\\,;\\ ]+/", trim($_POST["ITEMS"]));

		foreach ($data as $item)
		{
			if (check_email($item))
			{
				$newUsers["ITEMS"][] = [
					"EMAIL" => $item,
					"UF_DEPARTMENT" => [$departmentId]
				];
			}
			else if ($isInvitationBySmsAvailable && preg_match("/^[\d+][\d\(\)\ -]{4,22}\d$/", $item))
			{
				$newUsers["ITEMS"][] = [
					"PHONE" => $item,
					"PHONE_COUNTRY" => "",
					"UF_DEPARTMENT" => [$departmentId]
				];
			}
			else
			{
				$errorFormatItems[] = $item;
			}
		}

		if (!empty($errorFormatItems))
		{
			$strError = Loc::getMessage("BX24_INVITE_DIALOG_ERROR_"
										.($this->isInvitationBySmsAvailable() ? "EMAIL_OR_PHONE" : "EMAIL"));
			$strError.= ": ".implode(", ", $errorFormatItems);
			$this->addError(new \Bitrix\Main\Error($strError));
			return false;
		}

		if (!empty($newUsers))
		{
			$res = $this->registerNewUser($newUsers, $strError);
		}

		if (!empty($strError))
		{
			$this->addError(new \Bitrix\Main\Error($strError));
			return false;
		}

		return $res;
	}

	public function extranetAction()
	{
		if (!$this->isInvitingUsersAllowed() || !$this->isExtranetInstalled())
		{
			return false;
		}

		if (!$this->isMoreUserAvailable())
		{
			$this->addError(new \Bitrix\Main\Error("User limit"));
			return "user_limit";
		}

		if (
			!isset($_POST["SONET_GROUPS_CODE"])
			|| empty($_POST["SONET_GROUPS_CODE"])
		)
		{
			$this->addError(new \Bitrix\Main\Error(Loc::getMessage("BX24_INVITE_DIALOG_ERROR_EXTRANET_NO_SONET_GROUP_INVITE")));
			return false;
		}

		$strError = "";
		$userData = $_POST;

		$newUsers = [
			"ITEMS" => $userData["ITEMS"],
			"SONET_GROUPS_CODE" => isset($userData["SONET_GROUPS_CODE"]) ? $userData["SONET_GROUPS_CODE"] : []
		];

		$res = $this->registerNewUser($newUsers, $strError);

		if (!empty($strError))
		{
			$this->addError(new \Bitrix\Main\Error($strError));
			return false;
		}

		return $res;
	}

	public function selfAction()
	{
		if (!$this->isInvitingUsersAllowed())
		{
			return false;
		}

		$isCurrentUserAdmin = (
				Loader::includeModule("bitrix24") && \CBitrix24::IsPortalAdmin(\Bitrix\Main\Engine\CurrentUser::get()->getId())
				|| \Bitrix\Main\Engine\CurrentUser::get()->isAdmin()
			)
			? true : false;

		if (Loader::includeModule("socialservices"))
		{
			$settings = [
				"REGISTER" => $_POST["allow_register"],
				"REGISTER_SECRET" => $_POST["allow_register_secret"]
			];

			if ($isCurrentUserAdmin)
			{
				$settings["REGISTER_CONFIRM"] = $_POST["allow_register_confirm"];
				$settings["REGISTER_WHITELIST"] = $_POST["allow_register_whitelist"];
			}

			\Bitrix\Socialservices\Network::setRegisterSettings($settings);
		}

		return Loc::getMessage("BX24_INVITE_DIALOG_SELF_SUCCESS", array("#SITE_DIR#" => SITE_DIR));
	}

	public function addAction()
	{
		if (!$this->isInvitingUsersAllowed())
		{
			return false;
		}

		if (!$this->isMoreUserAvailable())
		{
			$this->addError(new \Bitrix\Main\Error("User limit"));
			return "user_limit";
		}

		$userData = $_POST;

		if (empty($userData["DEPARTMENT_ID"]))
		{
			$departmentId = $this->getHeadDepartmentId();
			$userData["DEPARTMENT_ID"] = [$departmentId];
		}

		$idAdded = CIntranetInviteDialog::AddNewUser(SITE_ID, $userData, $strError);

		if ($idAdded)
		{
			CIntranetInviteDialog::RequestToSonetGroups($idAdded, $_POST["SONET_GROUPS_CODE"], "");
		}

		if (!empty($strError))
		{
			$this->addError(new \Bitrix\Main\Error($strError));
			return false;
		}

		$res = $this->prepareUsersForResponse([$idAdded]);

		CIntranetInviteDialog::logAction($idAdded, 'intranet', 'add_user', 'add_dialog');

		return $res;
	}

	public function inviteIntegratorAction()
	{
		global $USER;

		if (!Loader::includeModule("bitrix24"))
		{
			return false;
		}

		if (!$this->isInvitingUsersAllowed())
		{
			return false;
		}

		if (!check_email($_POST["integrator_email"]))
		{
			$this->addError(new \Bitrix\Main\Error(Loc::getMessage("BX24_INVITE_DIALOG_ERROR_EMAIL")));
			return false;
		}

		if (!Integrator::isMoreIntegratorsAvailable())
		{
			$this->addError(new \Bitrix\Main\Error(Loc::getMessage("BX24_INVITE_DIALOG_INTEGRATOR_COUNT_ERROR", array(
				"#LINK_START#" => "<a href=\"/company/?apply_filter=Y&INTEGRATOR=Y&FIRED=N\">",
				"#LINK_END#" => "</a>",
			))));
			return false;
		}

		$error = "";
		if (!Integrator::checkPartnerEmail($_POST["integrator_email"], $error))
		{
			$this->addError(new \Bitrix\Main\Error($error));
			return false;
		}

		$messageText = Loc::getMessage("BX24_INVITE_DIALOG_INTEGRATOR_INVITE_TEXT");

		//$oldIntegratorId = \CBitrix24::getIntegratorId();

		$strError = "";
		$newIntegratorId = CIntranetInviteDialog::inviteIntegrator(SITE_ID, $_POST["integrator_email"], $messageText, $strError);

		if (!empty($strError))
		{
			$this->addError(new \Bitrix\Main\Error($strError));
			return false;
		}

		/*if ($oldIntegratorId && $newIntegratorId)
		{
			$USER->Update($oldIntegratorId, array("ACTIVE" => "N"));
		}*/

		CIntranetInviteDialog::logAction($newIntegratorId, 'intranet', 'invite_user', 'integrator_dialog');

		$res = $this->prepareUsersForResponse([$newIntegratorId]);

		return $res;
	}
}