403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/socialnetwork/classes/general/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/socialnetwork/classes/general/group.php
<?php

IncludeModuleLangFile(__FILE__);

use Bitrix\Main\Config\Option;
use Bitrix\Main\Context;
use Bitrix\Main\Loader;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\Text\Emoji;
use Bitrix\Socialnetwork\FeatureTable;
use Bitrix\Socialnetwork\Helper\Workgroup;
use Bitrix\Socialnetwork\Helper\Path;
use Bitrix\Socialnetwork\Internals\Registry\GroupRegistry;
use Bitrix\Socialnetwork\Item\Workgroup\AvatarType;
use Bitrix\Socialnetwork\Item\Workgroup\Type;
use Bitrix\Socialnetwork\UserToGroupTable;
use Bitrix\Tasks\Util\Restriction\Bitrix24Restriction\Limit\ProjectLimit;
use Bitrix\Tasks\Util\Restriction\Bitrix24Restriction\Limit\ScrumLimit;
use Bitrix\Tasks\Control\Tag;
use Bitrix\Socialnetwork\Internals\EventService;

class CAllSocNetGroup
{
	protected static $staticCache = array();

	/***************************************/
	/********  DATA MODIFICATION  **********/
	/***************************************/
	public static function CheckFields($ACTION, &$arFields, $ID = 0): bool
	{
		global $DB, $APPLICATION, $USER_FIELD_MANAGER, $arSocNetAllowedInitiatePerms, $arSocNetAllowedSpamPerms;

		if ($ACTION !== "ADD" && (int)$ID <= 0)
		{
			$APPLICATION->ThrowException("System error 870164", "ERROR");
			return false;
		}

		if(
			($ID === 0 && !is_set($arFields, "SITE_ID"))
			||
			(
				is_set($arFields, "SITE_ID")
				&& (
					(is_array($arFields["SITE_ID"]) && count($arFields["SITE_ID"]) <= 0)
					||
					(!is_array($arFields["SITE_ID"]) && $arFields["SITE_ID"] == '')
				)
			)
		)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GG_EMPTY_SITE_ID"), "EMPTY_SITE_ID");
			return false;
		}
		elseif(is_set($arFields, "SITE_ID"))
		{
			if(!is_array($arFields["SITE_ID"]))
				$arFields["SITE_ID"] = array($arFields["SITE_ID"]);

			foreach($arFields["SITE_ID"] as $v)
			{
				$r = CSite::GetByID($v);
				if(!$r->Fetch())
				{
					$APPLICATION->ThrowException(str_replace("#ID#", $v, GetMessage("SONET_GG_ERROR_NO_SITE")), "ERROR_NO_SITE");
					return false;
				}
			}
		}

		if ((is_set($arFields, "NAME") || $ACTION === "ADD") && ($arFields["NAME"] ?? '') === '')
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_NAME"), "EMPTY_NAME");
			return false;
		}

		if (is_set($arFields, "DATE_CREATE") && (!$DB->IsDate($arFields["DATE_CREATE"], false, LANG, "FULL")))
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_DATE_CREATE"), "EMPTY_DATE_CREATE");
			return false;
		}

		if (is_set($arFields, "DATE_UPDATE") && (!$DB->IsDate($arFields["DATE_UPDATE"], false, LANG, "FULL")))
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_DATE_UPDATE"), "EMPTY_DATE_UPDATE");
			return false;
		}

		if (is_set($arFields, "DATE_ACTIVITY") && (!$DB->IsDate($arFields["DATE_ACTIVITY"], false, LANG, "FULL")))
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_DATE_ACTIVITY"), "EMPTY_DATE_ACTIVITY");
			return false;
		}

		if ((is_set($arFields, "OWNER_ID") || $ACTION === "ADD") && (int)$arFields["OWNER_ID"] <= 0)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_OWNER_ID"), "EMPTY_OWNER_ID");
			return false;
		}

		if (is_set($arFields, "OWNER_ID"))
		{
			$dbResult = CUser::GetByID($arFields["OWNER_ID"]);
			if (!$dbResult->Fetch())
			{
				$APPLICATION->ThrowException(GetMessage("SONET_GB_ERROR_NO_OWNER_ID"), "ERROR_NO_OWNER_ID");
				return false;
			}
		}

		if ((is_set($arFields, "SUBJECT_ID") || $ACTION === "ADD") && (int)$arFields["SUBJECT_ID"] <= 0)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GB_EMPTY_SUBJECT_ID"), "EMPTY_SUBJECT_ID");
			return false;
		}

		if (is_set($arFields, "SUBJECT_ID"))
		{
			$arResult = CSocNetGroupSubject::GetByID($arFields["SUBJECT_ID"]);
			if ($arResult == false)
			{
				$APPLICATION->ThrowException(GetMessage("SONET_GB_ERROR_NO_SUBJECT_ID"), "ERROR_NO_SUBJECT_ID");
				return false;
			}
		}

		if ((is_set($arFields, "ACTIVE") || $ACTION === "ADD") && $arFields["ACTIVE"] !== "Y" && $arFields["ACTIVE"] !== "N")
		{
			$arFields["ACTIVE"] = "Y";
		}

		if (
			(is_set($arFields, "VISIBLE") || $ACTION === "ADD")
			&& ($arFields["VISIBLE"] ?? null) !== "Y"
			&& ($arFields["VISIBLE"] ?? null) !== "N"
		)
		{
			$arFields["VISIBLE"] = "Y";
		}

		if (
			(is_set($arFields, "OPENED") || $ACTION === "ADD")
			&& ($arFields["OPENED"] ?? null) !== "Y"
			&& ($arFields["OPENED"] ?? null) !== "N"
		)
		{
			$arFields["OPENED"] = "N";
		}

		if (
			(is_set($arFields, "CLOSED") || $ACTION=="ADD")
			&& ($arFields["CLOSED"] ?? null) != "Y"
			&& ($arFields["CLOSED"] ?? null) !== "N"
		)
		{
			$arFields["CLOSED"] = "N";
		}

		if ((is_set($arFields, "INITIATE_PERMS") || $ACTION === "ADD") && $arFields["INITIATE_PERMS"] == '')
		{
			$APPLICATION->ThrowException(GetMessage("SONET_UG_EMPTY_INITIATE_PERMS"), "EMPTY_INITIATE_PERMS");
			return false;
		}

		if (is_set($arFields, "INITIATE_PERMS") && !in_array($arFields["INITIATE_PERMS"], $arSocNetAllowedInitiatePerms))
		{
			$APPLICATION->ThrowException(str_replace("#ID#", $arFields["INITIATE_PERMS"], GetMessage("SONET_UG_ERROR_NO_INITIATE_PERMS")), "ERROR_NO_INITIATE_PERMS");
			return false;
		}

		if ((is_set($arFields, "SPAM_PERMS") || $ACTION === "ADD") && $arFields["SPAM_PERMS"] == '')
		{
			$APPLICATION->ThrowException(GetMessage("SONET_UG_EMPTY_SPAM_PERMS"), "EMPTY_SPAM_PERMS");
			return false;
		}

		if (is_set($arFields, "SPAM_PERMS") && !in_array($arFields["SPAM_PERMS"], $arSocNetAllowedSpamPerms))
		{
			$APPLICATION->ThrowException(str_replace("#ID#", $arFields["SPAM_PERMS"], GetMessage("SONET_UG_ERROR_NO_SPAM_PERMS")), "ERROR_NO_SPAM_PERMS");
			return false;
		}

		if (
			is_set($arFields, "IMAGE_ID")
			&& is_array($arFields["IMAGE_ID"])
			&& ($arFields["IMAGE_ID"]["name"] ?? '') == ''
			&& (($arFields["IMAGE_ID"]["del"] ?? null) == '' || $arFields["IMAGE_ID"]["del"] !== "Y")
		)
		{
			unset($arFields["IMAGE_ID"]);
		}

		if (is_set($arFields, "IMAGE_ID"))
		{
			$arResult = CFile::CheckImageFile($arFields["IMAGE_ID"]);
			if ($arResult <> '')
			{
				$APPLICATION->ThrowException(GetMessage("SONET_GP_ERROR_IMAGE_ID").": ".$arResult, "ERROR_IMAGE_ID");
				return false;
			}
		}

		$avatarType = $arFields['AVATAR_TYPE'] ?? null;
		if (
			is_set($arFields, 'AVATAR_TYPE')
			&& !array_key_exists($arFields['AVATAR_TYPE'], Workgroup::getAvatarTypes())
		)
		{
			unset($arFields['AVATAR_TYPE']);
		}

		$canSetEmptyAvatarType =
			($arFields['TYPE'] ?? null) === Type::Collab->value
			&& $avatarType === AvatarType::None->value
		;

		if ($canSetEmptyAvatarType)
		{
			$arFields['AVATAR_TYPE'] = '';
		}

		if (!$USER_FIELD_MANAGER->CheckFields("SONET_GROUP", $ID, $arFields))
		{
			return false;
		}

		if (!empty($arFields['NAME']))
		{
			$arFields['NAME'] = Emoji::encode($arFields['NAME']);
		}

		if (isset($arFields['NAME']))
		{
			$isCollab = $arFields['TYPE'] === Bitrix\Socialnetwork\Item\Workgroup\Type::Collab->value;
			$isCheckNameNeeded = $isCollab || (Option::get('socialnetwork', 'check_group_name_enable', 'Y') === 'Y');

			if ($isCheckNameNeeded)
			{
				$groupProvider = Bitrix\Socialnetwork\Provider\GroupProvider::getInstance();

				if ($groupProvider->isExistingGroup($arFields['NAME'], $ID))
				{
					$APPLICATION->ThrowException(GetMessage("SONET_ERROR_SAME_GROUP_NAME_EXISTS"), 'ERROR_GROUP_NAME_EXISTS');
					return false;
				}
			}
		}

		if (!empty($arFields['DESCRIPTION']))
		{
			$arFields['DESCRIPTION'] = Emoji::encode($arFields['DESCRIPTION']);
		}

		if (isset($arFields['TYPE']))
		{
			if (!Type::isValid($arFields['TYPE']))
			{
				$APPLICATION->ThrowException('Wrong type', 'WRONG_GROUP_TYPE');
				return false;
			}

			$arFields['TYPE'] = Type::getValue($arFields['TYPE']);
		}

		if (!is_string($arFields['KEYWORDS'] ?? ''))
		{
			unset($arFields['KEYWORDS']);
		}

		return true;
	}

	public static function Delete($ID)
	{
		global $DB, $APPLICATION, $CACHE_MANAGER, $USER_FIELD_MANAGER;

		if (!CSocNetGroup::__ValidateID($ID))
		{
			return false;
		}

		$ID = intval($ID);

		$db_events = GetModuleEvents("socialnetwork", "OnBeforeSocNetGroupDelete");
		while ($arEvent = $db_events->Fetch())
		{
			if (ExecuteModuleEventEx($arEvent, array($ID))===false)
			{
				return false;
			}
		}

		$queryObject = \Bitrix\Socialnetwork\WorkgroupTable::getList([
			'filter' => ['ID' => $ID],
			'select' => ['IMAGE_ID', 'NAME', 'PROJECT', 'TYPE'],
		]);
		$arGroup = $queryObject->fetch();
		if (!$arGroup)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_NO_GROUP"), "ERROR_NO_GROUP");
			return false;
		}

		$isCollab = $arGroup['TYPE'] === Type::Collab->value;

		$DB->StartTransaction();

		$events = GetModuleEvents("socialnetwork", "OnSocNetGroupDelete");
		while ($arEvent = $events->Fetch())
		{
			ExecuteModuleEventEx($arEvent, array($ID));
		}

		EventService\Service::addEvent(EventService\EventDictionary::EVENT_WORKGROUP_DELETE, [
			'GROUP_ID' => $ID,
		]);

		$res = UserToGroupTable::getList([
			'filter' => [
				'=GROUP_ID' => $ID
			],
			'select' => [ 'USER_ID' ]
		]);
		while($relationFields = $res->fetch())
		{
			CSocNetSearch::onUserRelationsChange($relationFields['USER_ID']);
		}
		$bSuccess = $DB->Query("DELETE FROM b_sonet_user2group WHERE GROUP_ID = ".$ID, true);

		if ($bSuccess)
		{
			if (!$isCollab)
			{
				Bitrix\Socialnetwork\Integration\Im\Chat\Workgroup::unlinkChat([
					'group_id' => $ID,
					'group_name' => $arGroup['NAME'],
					'group_project' => $arGroup['PROJECT'],
				]);
			}

			$bSuccessTmp = true;
			$dbResult = CSocNetFeatures::GetList(
				array(),
				array("ENTITY_ID" => $ID, "ENTITY_TYPE" => SONET_ENTITY_GROUP)
			);
			while ($arResult = $dbResult->Fetch())
			{
				$bSuccessTmp = $DB->Query("DELETE FROM b_sonet_features2perms WHERE FEATURE_ID = ".$arResult["ID"]."", true);
				if (!$bSuccessTmp)
				{
					break;
				}
			}
			if (!$bSuccessTmp)
			{
				$bSuccess = false;
			}
		}
		if ($bSuccess)
		{
			$bSuccess = $DB->Query("DELETE FROM b_sonet_features WHERE ENTITY_ID = ".$ID." AND ENTITY_TYPE = '".$DB->ForSql(SONET_ENTITY_GROUP, 1)."'", true);
		}
		if ($bSuccess)
		{
			$dbResult = CSocNetLog::GetList(
				array(),
				array("ENTITY_ID" => $ID, "ENTITY_TYPE" => SONET_ENTITY_GROUP),
				false,
				false,
				array("ID")
			);
			while ($arResult = $dbResult->Fetch())
			{
				$bSuccessTmp = $DB->Query("DELETE FROM b_sonet_log_site WHERE LOG_ID = ".$arResult["ID"]."", true);
				if (!$bSuccessTmp)
				{
					break;
				}

				$bSuccessTmp = $DB->Query("DELETE FROM b_sonet_log_right WHERE LOG_ID = ".$arResult["ID"]."", true);
				if (!$bSuccessTmp)
				{
					break;
				}
			}
			if (!$bSuccessTmp)
			{
				$bSuccess = false;
			}
		}
		if ($bSuccess)
		{
			$bSuccess = $DB->Query("DELETE FROM b_sonet_log WHERE ENTITY_TYPE = '".SONET_ENTITY_GROUP."' AND ENTITY_ID = ".$ID."", true);
		}
		if ($bSuccess)
		{
			$bSuccess = CSocNetLog::DeleteSystemEventsByGroupID($ID);
		}
		if ($bSuccess)
		{
			$bSuccess = $DB->Query("DELETE FROM b_sonet_log_events WHERE ENTITY_TYPE = 'G' AND ENTITY_ID = ".$ID."", true);
		}
		if ($bSuccess)
		{
			$bSuccess = $DB->Query("DELETE FROM b_sonet_group_site WHERE GROUP_ID = ".$ID."", true);
		}
		if ($bSuccess)
		{
			$bSuccess = $DB->Query("DELETE FROM b_sonet_log_right WHERE GROUP_CODE LIKE 'OSG".$ID."\_%'", true);
		}
		if ($bSuccess)
		{
			$bSuccess = $DB->Query("DELETE FROM b_sonet_log_right WHERE GROUP_CODE LIKE 'SG".$ID."\_%'", true);
		}
		if ($bSuccess)
		{
			$bSuccess = $DB->Query("DELETE FROM b_sonet_log_right WHERE GROUP_CODE = 'SG".$ID."'", true);
		}
		if ($bSuccess)
		{
			$bSuccess = CSocNetSubscription::DeleteEx(false, "SG".$ID);
		}
		if ($bSuccess)
		{
			$bSuccess = \Bitrix\Socialnetwork\WorkgroupTagTable::deleteByGroupId(['groupId' => $ID]);
		}

		if ($bSuccess)
		{
			CFile::Delete($arGroup["IMAGE_ID"]);
			$bSuccess = $DB->Query("DELETE FROM b_sonet_group WHERE ID = ".$ID."", true);
		}

		$sonetGroupCache = self::getStaticCache();

		if ($bSuccess)
		{
			CUserOptions::DeleteOption("socialnetwork", "~menu_".SONET_ENTITY_GROUP."_".$ID, false, 0);

			unset($sonetGroupCache[$ID]);
			self::setStaticCache($sonetGroupCache);
			GroupRegistry::getInstance()->invalidate($ID);
			FeatureTable::cleanCache();
		}

		if ($bSuccess)
		{
			$DB->Commit();
		}
		else
		{
			$DB->Rollback();
		}

		if ($bSuccess)
		{
			unset($sonetGroupCache[$ID]);
			self::setStaticCache($sonetGroupCache);

			if(defined("BX_COMP_MANAGED_CACHE"))
			{
				$CACHE_MANAGER->ClearByTag("sonet_user2group_G".$ID);
				$CACHE_MANAGER->ClearByTag("sonet_user2group");
				$CACHE_MANAGER->ClearByTag("sonet_group_".$ID);
				$CACHE_MANAGER->ClearByTag("sonet_group");
			}
		}

		if (
			$bSuccess
			&& CModule::IncludeModule("search")
		)
		{
			CSearch::DeleteIndex("socialnetwork", "G".$ID);
		}

		if ($bSuccess)
		{
			$DB->Query("DELETE FROM b_sonet_event_user_view WHERE ENTITY_TYPE = '".SONET_ENTITY_GROUP."' AND ENTITY_ID = ".$ID, true);
		}

		if ($bSuccess)
		{
			$USER_FIELD_MANAGER->Delete("SONET_GROUP", $ID);
		}

		$groupId = (int)$ID;
		if ($bSuccess && $groupId > 0)
		{
			GroupRegistry::getInstance()->invalidate($groupId);
		}

		if (Loader::includeModule('tasks'))
		{
			$tagService = new Tag(0);
			$tagService->deleteGroupTags($ID);
		}

		return $bSuccess;
	}

	public static function DeleteNoDemand($userID): bool
	{
		global $APPLICATION;

		if (!CSocNetGroup::__ValidateID($userID))
		{
			return false;
		}

		$userID = intval($userID);

		$err = "";
		$dbResult = CSocNetGroup::GetList(array(), array("OWNER_ID" => $userID), false, false, array("ID", "NAME"));
		while ($arResult = $dbResult->GetNext())
		{
			$err .= Emoji::decode($arResult["NAME"]) . "<br>";
		}

		if ($err == '')
		{
			return true;
		}
		else
		{
			$err = GetMessage("SONET_GG_ERROR_CANNOT_DELETE_USER_1").$err;
			$err .= GetMessage("SONET_GG_ERROR_CANNOT_DELETE_USER_2");
			$APPLICATION->ThrowException($err);
			return false;
		}
	}

	public static function SetStat($ID, int $currentUserId = 0): void
	{
		if (!CSocNetGroup::__ValidateID($ID))
			return;

		$ID = intval($ID);

		$num = CSocNetUserToGroup::GetList(
			array(),
			array(
				"GROUP_ID" => $ID,
				"USER_ACTIVE" => "Y",
				"<=ROLE" => SONET_ROLES_USER
			),
			array()
		);

		$num_mods = CSocNetUserToGroup::GetList(
			array(),
			array(
				"GROUP_ID" => $ID,
				"USER_ACTIVE" => "Y",
				"<=ROLE" => SONET_ROLES_MODERATOR
			),
			array()
		);

		CSocNetGroup::Update(
			$ID,
			array(
				"NUMBER_OF_MEMBERS" => $num,
				"NUMBER_OF_MODERATORS" => $num_mods,
				'INITIATED_BY_USER_ID' => $currentUserId,
			),
			true,
			false,
			false
		);
	}

	public static function SetLastActivity($ID, $date = false): void
	{
		global $DB, $CACHE_MANAGER;

		if (!CSocNetGroup::__ValidateID($ID))
		{
			return;
		}

		$ID = intval($ID);

		CSocNetGroup::Update($ID, (
			$date
				? array("DATE_ACTIVITY" => $date)
				: array("=DATE_ACTIVITY" => $DB->CurrentTimeFunction())
			),
			true,
			false,
			false
		);

		if (defined("BX_COMP_MANAGED_CACHE"))
		{
			$CACHE_MANAGER->clearByTag("sonet_group_activity");
		}
	}

	/***************************************/
	/**********  DATA SELECTION  ***********/
	/***************************************/
	public static function getById($id, $checkPermissions = false, array $options = [])
	{
		global $USER, $CACHE_MANAGER;

		$id = (int)$id;

		if (!CSocNetGroup::__ValidateID($id))
		{
			return false;
		}

		$staticCacheKey = implode('_', array_merge([
			($checkPermissions ? 'Y' : 'N'),
		], $options));

		$sonetGroupCache = self::getStaticCache();

		if (
			is_array($sonetGroupCache)
			&& is_array(($sonetGroupCache[$id] ?? null))
			&& is_array(($sonetGroupCache[$id][$staticCacheKey] ?? null))
		)
		{
			return $sonetGroupCache[$id][$staticCacheKey];
		}

		$cache = false;
		$cachePath = false;

		if (!$checkPermissions)
		{
			$cache = new CPHPCache;
			$cacheTime = 31536000;
			$cacheId = implode('_', array_merge([
				'group',
				$id,
				LANGUAGE_ID,
				CTimeZone::getOffset(),
				Context::getCurrent()->getCulture()->getDateTimeFormat()
			], $options));
			$cachePath = '/sonet/group/' . $id . '/';
		}

		if (
			$cache
			&& $cache->initCache($cacheTime, $cacheId, $cachePath)
		)
		{
			$cacheVars = $cache->getVars();
			$result = $cacheVars['FIELDS'];
		}
		else
		{
			if ($cache)
			{
				$cache->startDataCache($cacheTime, $cacheId, $cachePath);
			}

			$filter = [
				'ID' => $id,
			];

			if (
				$checkPermissions
				&& is_object($USER)
				&& ($USER->GetID() > 0)
			)
			{
				$filter['CHECK_PERMISSIONS'] = $USER->getId();
			}

			$select = [
				"ID", "SITE_ID", "NAME", "DESCRIPTION", "DATE_CREATE", "DATE_UPDATE", "ACTIVE", "VISIBLE", "OPENED", "CLOSED", "SUBJECT_ID", "OWNER_ID", "KEYWORDS",
				'IMAGE_ID', 'AVATAR_TYPE',
				"NUMBER_OF_MEMBERS", "NUMBER_OF_MODERATORS",
				"INITIATE_PERMS", "SPAM_PERMS",
				"DATE_ACTIVITY", "SUBJECT_NAME", 'TYPE', "UF_*",
			];
			if (ModuleManager::isModuleInstalled('intranet'))
			{
				$select = array_merge($select, [ "PROJECT", "PROJECT_DATE_START", "PROJECT_DATE_FINISH" ]);
			}
			if (ModuleManager::isModuleInstalled('landing'))
			{
				$select = array_merge($select, [ "LANDING" ]);
			}
			if (ModuleManager::isModuleInstalled('tasks'))
			{
				$select = array_merge($select, [ "SCRUM_OWNER_ID", "SCRUM_MASTER_ID", "SCRUM_SPRINT_DURATION", "SCRUM_TASK_RESPONSIBLE" ]);
			}
			$res = CSocNetGroup::getList(
				[],
				$filter,
				false,
				false,
				$select
			);
			if ($result = $res->getNext())
			{
				if (
					defined('BX_COMP_MANAGED_CACHE')
					&& $cache
				)
				{
					$CACHE_MANAGER->StartTagCache($cachePath);
					$CACHE_MANAGER->RegisterTag('sonet_group_' . $id);
					$CACHE_MANAGER->RegisterTag('sonet_group');
				}

				if (!empty($result['NAME']))
				{
					$result['NAME'] = Emoji::decode($result['NAME']);
				}
				if (!empty($result['DESCRIPTION']))
				{
					$result['DESCRIPTION'] = Emoji::decode($result['DESCRIPTION']);
				}

				$result['NAME_FORMATTED'] = $result['NAME'];

				if (($options['getSites'] ?? false))
				{
					$result['SITE_LIST'] = [];
					$res = CSocNetGroup::getSite($id);
					while ($groupSiteFields = $res->fetch())
					{
						$result['SITE_LIST'][] = $groupSiteFields['LID'];
					}
				}

				$result['SCRUM'] = (isset($result['SCRUM_MASTER_ID']) && (int)$result['SCRUM_MASTER_ID'] > 0 ? 'Y' : 'N');
				$result['SCRUM_PROJECT'] = $result['SCRUM'];
			}
			else
			{
				$result = false;
			}

			if ($cache)
			{
				$cacheData = [
					'FIELDS' => $result,
				];
				$cache->EndDataCache($cacheData);
				if (defined('BX_COMP_MANAGED_CACHE'))
				{
					$CACHE_MANAGER->EndTagCache();
				}
			}
		}

		if (!is_array($sonetGroupCache))
		{
			$sonetGroupCache = [];
		}
		if (
			!array_key_exists($id, $sonetGroupCache)
			|| !is_array($sonetGroupCache[$id])
		)
		{
			$sonetGroupCache[$id] = [];
		}
		$sonetGroupCache[$id][$staticCacheKey] = $result;

		self::setStaticCache($sonetGroupCache);

		return $result;
	}

	protected static function getStaticCache(): array
	{
		return self::$staticCache;
	}

	protected static function setStaticCache($cache = array())
	{
		self::$staticCache = $cache;
	}

	/***************************************/
	/**********  COMMON METHODS  ***********/
	/***************************************/
	public static function CanUserInitiate($userID, $groupID): bool
	{
		$userID = intval($userID);
		$groupID = intval($groupID);
		if ($groupID <= 0)
			return false;

		$userRoleInGroup = CSocNetUserToGroup::GetUserRole($userID, $groupID);
		if ($userRoleInGroup == false)
			return false;

		$arGroup = CSocNetGroup::GetById($groupID);
		if ($arGroup == false)
			return false;

		if ($arGroup["INITIATE_PERMS"] == SONET_ROLES_MODERATOR)
		{
			if ($userRoleInGroup == SONET_ROLES_MODERATOR || $userRoleInGroup == SONET_ROLES_OWNER)
				return true;
			else
				return false;
		}
		elseif ($arGroup["INITIATE_PERMS"] == SONET_ROLES_USER)
		{
			if ($userRoleInGroup == SONET_ROLES_MODERATOR || $userRoleInGroup == SONET_ROLES_OWNER || $userRoleInGroup == SONET_ROLES_USER)
				return true;
			else
				return false;
		}
		elseif ($arGroup["INITIATE_PERMS"] == SONET_ROLES_OWNER)
		{
			if ($userRoleInGroup == SONET_ROLES_OWNER)
				return true;
			else
				return false;
		}

		return false;
	}

	public static function CanUserViewGroup($userID, $groupID): bool
	{
		$userID = intval($userID);
		$groupID = intval($groupID);
		if ($groupID <= 0)
			return false;

		$arGroup = CSocNetGroup::GetById($groupID);
		if ($arGroup == false)
			return false;

		if ($arGroup["VISIBLE"] == "Y")
			return true;

		$userRoleInGroup = CSocNetUserToGroup::GetUserRole($userID, $groupID);
		if ($userRoleInGroup == false)
			return false;

		return in_array($userRoleInGroup, array(SONET_ROLES_OWNER, SONET_ROLES_MODERATOR, SONET_ROLES_USER));
	}

	public static function CanUserReadGroup($userID, $groupID): bool
	{
		$userID = intval($userID);
		$groupID = intval($groupID);
		if ($groupID <= 0)
			return false;

		$arGroup = CSocNetGroup::GetById($groupID);
		if ($arGroup == false)
			return false;

		if ($arGroup["OPENED"] == "Y")
			return true;

		$userRoleInGroup = CSocNetUserToGroup::GetUserRole($userID, $groupID);
		if ($userRoleInGroup == false)
			return false;

		return in_array($userRoleInGroup, array(SONET_ROLES_OWNER, SONET_ROLES_MODERATOR, SONET_ROLES_USER));
	}

	/***************************************/
	/************  ACTIONS  ****************/
	/***************************************/
	public static function createGroup($ownerID, $arFields, $bAutoSubscribe = true)
	{
		global $APPLICATION, $DB;

		$ownerID = (int)$ownerID;
		if ($ownerID <= 0)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_UR_EMPTY_OWNERID").". ", "ERROR_OWNERID");
			return false;
		}

		if (!isset($arFields) || !is_array($arFields))
		{
			$APPLICATION->ThrowException(GetMessage("SONET_UR_EMPTY_FIELDS").". ", "ERROR_FIELDS");
			return false;
		}

		if (!empty($arFields['SCRUM_MASTER_ID']) && CModule::includeModule("tasks"))
		{
			$isScrumLimitExceeded = ScrumLimit::isLimitExceeded() || !ScrumLimit::isFeatureEnabled();
			if (ScrumLimit::canTurnOnTrial())
			{
				$isScrumLimitExceeded = false;
			}
			if ($isScrumLimitExceeded)
			{
				$APPLICATION->ThrowException("Scrum limit exceeded");

				return false;
			}
		}
		elseif (isset($arFields['TYPE']) && $arFields['TYPE'] === 'collab')
		{
			if (!\Bitrix\Socialnetwork\Collab\CollabFeature::isFeatureEnabled())
			{
				$APPLICATION->ThrowException('Collab feature not available');

				return false;
			}
		}
		elseif (empty($arFields['SCRUM_MASTER_ID']) && CModule::includeModule("tasks"))
		{
			$isProjectLimitExceeded = !ProjectLimit::isFeatureEnabled();
			if (ProjectLimit::canTurnOnTrial())
			{
				$isProjectLimitExceeded = false;
			}
			if ($isProjectLimitExceeded)
			{
				$APPLICATION->ThrowException("Project limit exceeded");

				return false;
			}
		}

		$DB->StartTransaction();

		if (!isset($arFields["DATE_CREATE"]))
		{
			$arFields["=DATE_CREATE"] = CDatabase::currentTimeFunction();
		}

		if (!isset($arFields["DATE_UPDATE"]))
		{
			$arFields["=DATE_UPDATE"] = CDatabase::currentTimeFunction();
		}

		if (!isset($arFields["DATE_ACTIVITY"]))
		{
			$arFields["=DATE_ACTIVITY"] = CDatabase::currentTimeFunction();
		}

		if (!isset($arFields['TYPE']))
		{
			$arFields['TYPE'] = static::getTypeByFields($arFields);
		}

		$arFields["ACTIVE"] = "Y";
		$arFields["OWNER_ID"] = $ownerID;

		if (!is_set($arFields, "SPAM_PERMS") || $arFields["SPAM_PERMS"] == '')
		{
			$arFields["SPAM_PERMS"] = SONET_ROLES_OWNER;
		}

		$groupID = CSocNetGroup::add($arFields);

		if (
			!$groupID
			|| $groupID <= 0
		)
		{
			$errorMessage = $errorID = "";
			if ($e = $APPLICATION->getException())
			{
				$errorMessage = $e->GetString();
				$errorID = $e->GetID();

				if (
					$errorID == ''
					&& isset($e->messages)
					&& is_array($e->messages)
					&& is_array($e->messages[0])
					&& array_key_exists("id", $e->messages[0])
				)
				{
					$errorID = $e->messages[0]["id"];
				}
			}

			if ($errorMessage == '')
			{
				$errorMessage = GetMessage("SONET_UR_ERROR_CREATE_GROUP").". ";
			}

			if ($errorID == '')
			{
				$errorID = "ERROR_CREATE_GROUP";
			}

			$APPLICATION->ThrowException($errorMessage, $errorID);
			$DB->Rollback();

			return false;
		}

		$arFields1 = array(
			"USER_ID" => $ownerID,
			"GROUP_ID" => $groupID,
			"ROLE" => SONET_ROLES_OWNER,
			"=DATE_CREATE" => $DB->CurrentTimeFunction(),
			"=DATE_UPDATE" => $DB->CurrentTimeFunction(),
			"INITIATED_BY_TYPE" => SONET_INITIATED_BY_USER,
			"INITIATED_BY_USER_ID" => $ownerID,
			"MESSAGE" => false
		);

		if (!CSocNetUserToGroup::Add($arFields1))
		{
			$errorMessage = "";
			if ($e = $APPLICATION->GetException())
			{
				$errorMessage = $e->GetString();
			}

			if ($errorMessage == '')
			{
				$errorMessage = GetMessage("SONET_UR_ERROR_CREATE_U_GROUP").". ";
			}

			$APPLICATION->ThrowException($errorMessage, "ERROR_CREATE_GROUP");
			$DB->Rollback();
			return false;
		}

		if ($bAutoSubscribe)
		{
			CSocNetLogEvents::AutoSubscribe($ownerID, SONET_ENTITY_GROUP, $groupID);
		}

		CSocNetSubscription::Set($ownerID, "SG".$groupID, "Y");

		$DB->Commit();

		return $groupID;
	}

	/***************************************/
	/*************  UTILITIES  *************/
	/***************************************/
	public static function __ValidateID($ID): bool
	{
		global $APPLICATION;

		if (intval($ID)."|" == $ID."|")
			return true;

		$APPLICATION->ThrowException(GetMessage("SONET_WRONG_PARAMETER_ID"), "ERROR_NO_ID");
		return false;
	}

	public static function GetFilterOperation($key): array
	{
		$strNegative = "N";
		if (mb_substr($key, 0, 1) == "!")
		{
			$key = mb_substr($key, 1);
			$strNegative = "Y";
		}

		$strOrNull = "N";
		if (mb_substr($key, 0, 1) == "+")
		{
			$key = mb_substr($key, 1);
			$strOrNull = "Y";
		}

		if (mb_substr($key, 0, 2) == ">=")
		{
			$key = mb_substr($key, 2);
			$strOperation = ">=";
		}
		elseif (mb_substr($key, 0, 1) == ">")
		{
			$key = mb_substr($key, 1);
			$strOperation = ">";
		}
		elseif (mb_substr($key, 0, 2) == "<=")
		{
			$key = mb_substr($key, 2);
			$strOperation = "<=";
		}
		elseif (mb_substr($key, 0, 1) == "<")
		{
			$key = mb_substr($key, 1);
			$strOperation = "<";
		}
		elseif (mb_substr($key, 0, 1) == "@")
		{
			$key = mb_substr($key, 1);
			$strOperation = "IN";
		}
		elseif (mb_substr($key, 0, 1) == "~")
		{
			$key = mb_substr($key, 1);
			$strOperation = "LIKE";
		}
		elseif (mb_substr($key, 0, 1) == "%")
		{
			$key = mb_substr($key, 1);
			$strOperation = "QUERY";
		}
		else
		{
			$strOperation = "=";
		}

		return array("FIELD" => $key, "NEGATIVE" => $strNegative, "OPERATION" => $strOperation, "OR_NULL" => $strOrNull);
	}

	public static function PrepareSql(&$arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields, $arUF = array()): array
	{
		global $DB;

		$obUserFieldsSql = false;

		if (is_array($arUF) && array_key_exists("ENTITY_ID", $arUF))
		{
			$obUserFieldsSql = new CUserTypeSQL;
			$obUserFieldsSql->SetEntity($arUF["ENTITY_ID"], $arFields["ID"]["FIELD"]);
			$obUserFieldsSql->SetSelect($arSelectFields);
			$obUserFieldsSql->SetFilter($arFilter);
			$obUserFieldsSql->SetOrder($arOrder);
		}

		$strSqlSelect = "";
		$strSqlFrom = "";
		$strSqlWhere = "";
		$strSqlGroupBy = "";

		$arGroupByFunct = array("COUNT", "AVG", "MIN", "MAX", "SUM");

		$arAlreadyJoined = array();

		// GROUP BY -->
		if (is_array($arGroupBy) && count($arGroupBy)>0)
		{
			$arSelectFields = $arGroupBy;
			foreach ($arGroupBy as $key => $val)
			{
				$val = mb_strtoupper($val);
				$key = mb_strtoupper($key);
				if (array_key_exists($val, $arFields) && !in_array($key, $arGroupByFunct))
				{
					if ($strSqlGroupBy <> '')
						$strSqlGroupBy .= ", ";
					$strSqlGroupBy .= $arFields[$val]["FIELD"];

					if (isset($arFields[$val]["FROM"])
						&& $arFields[$val]["FROM"] <> ''
						&& !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
					{
						if ($strSqlFrom <> '')
							$strSqlFrom .= " ";
						$strSqlFrom .= $arFields[$val]["FROM"];
						$arAlreadyJoined[] = $arFields[$val]["FROM"];
					}
				}
			}
		}
		// <-- GROUP BY

		// WHERE -->
		$arAlreadyJoinedOld = $arAlreadyJoined;

		if (
			isset($arFilter['ID'])
			&& is_array($arFilter['ID'])
		)
		{
			$arFilter['@ID'] = $arFilter['ID'];
			unset($arFilter['ID']);
		}
		if (
			isset($arFilter['!ID'])
			&& is_array($arFilter['!ID'])
		)
		{
			$arFilter['!@ID'] = $arFilter['!ID'];
			unset($arFilter['!ID']);
		}

		$strSqlWhere .= CSqlUtil::PrepareWhere($arFields, $arFilter, $arAlreadyJoined);
		$arAlreadyJoinedDiff = array_diff($arAlreadyJoined, $arAlreadyJoinedOld);

		foreach($arAlreadyJoinedDiff as $from_tmp)
		{
			if ($strSqlFrom <> '')
				$strSqlFrom .= " ";
			$strSqlFrom .= $from_tmp;
		}

		if ($obUserFieldsSql)
		{
			$r = $obUserFieldsSql->GetFilter();
			if($r <> '')
				$strSqlWhere .= ($strSqlWhere <> '' ? " AND" : "")." (".$r.") ";
		}
		// <-- WHERE

		// ORDER BY -->
		$arSqlOrder = Array();
		foreach ($arOrder as $by => $order)
		{
			$by = mb_strtoupper($by);
			$order = mb_strtoupper($order);

			if ($order != "ASC")
				$order = "DESC";
			else
				$order = "ASC";

			if (array_key_exists($by, $arFields))
			{
				if ($arFields[$by]["TYPE"] == "datetime" || $arFields[$by]["TYPE"] == "date")
				{
					$arSqlOrder[] = " ".$by."_X1 ".$order." ";
					if (!is_array($arSelectFields) || !in_array($by, $arSelectFields))
						$arSelectFields[] = $by;
				}
				else
					$arSqlOrder[] = " ".$arFields[$by]["FIELD"]." ".$order." ";

				if (isset($arFields[$by]["FROM"])
					&& $arFields[$by]["FROM"] <> ''
					&& !in_array($arFields[$by]["FROM"], $arAlreadyJoined))
				{
					if ($strSqlFrom <> '')
						$strSqlFrom .= " ";
					$strSqlFrom .= $arFields[$by]["FROM"];
					$arAlreadyJoined[] = $arFields[$by]["FROM"];
				}
			}
			elseif($obUserFieldsSql && $s = $obUserFieldsSql->GetOrder($by))
				$arSqlOrder[$by] = " ".$s." ".$order." ";
		}

		$strSqlOrderBy = "";
		DelDuplicateSort($arSqlOrder);
		$tmp_count = count($arSqlOrder);
		for ($i=0; $i < $tmp_count; $i++)
		{
			if ($strSqlOrderBy <> '')
				$strSqlOrderBy .= ", ";

			if($DB->type == "ORACLE")
			{
				if(mb_substr($arSqlOrder[$i], -3) == "ASC")
					$strSqlOrderBy .= $arSqlOrder[$i]." NULLS FIRST";
				else
					$strSqlOrderBy .= $arSqlOrder[$i]." NULLS LAST";
			}
			else
				$strSqlOrderBy .= $arSqlOrder[$i];
		}
		// <-- ORDER BY

		// SELECT -->
		$arFieldsKeys = array_keys($arFields);

		if (is_array($arGroupBy) && count($arGroupBy)==0)
			$strSqlSelect = "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT ";
		else
		{
			if (isset($arSelectFields) && !is_array($arSelectFields) && is_string($arSelectFields) && $arSelectFields <> '' && array_key_exists($arSelectFields, $arFields))
				$arSelectFields = array($arSelectFields);

			if (!isset($arSelectFields)
				|| !is_array($arSelectFields)
				|| count($arSelectFields) <= 0
				|| in_array("*", $arSelectFields))
			{
				$tmp_count = count($arFieldsKeys);
				for ($i = 0; $i < $tmp_count; $i++)
				{
					if (isset($arFields[$arFieldsKeys[$i]]["WHERE_ONLY"])
						&& $arFields[$arFieldsKeys[$i]]["WHERE_ONLY"] == "Y")
						continue;

					if ($strSqlSelect <> '')
						$strSqlSelect .= ", ";

					if ($arFields[$arFieldsKeys[$i]]["TYPE"] == "datetime")
					{
						if (array_key_exists($arFieldsKeys[$i], $arOrder))
							$strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i]."_X1, ";

						$strSqlSelect .= $DB->DateToCharFunction($arFields[$arFieldsKeys[$i]]["FIELD"])." as ".$arFieldsKeys[$i];
					}
					elseif ($arFields[$arFieldsKeys[$i]]["TYPE"] == "date")
					{
						if (array_key_exists($arFieldsKeys[$i], $arOrder))
							$strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i]."_X1, ";

						$strSqlSelect .= $DB->DateToCharFunction($arFields[$arFieldsKeys[$i]]["FIELD"], "SHORT")." as ".$arFieldsKeys[$i];
					}
					else
						$strSqlSelect .= $arFields[$arFieldsKeys[$i]]["FIELD"]." as ".$arFieldsKeys[$i];

					if (isset($arFields[$arFieldsKeys[$i]]["FROM"])
						&& $arFields[$arFieldsKeys[$i]]["FROM"] <> ''
						&& !in_array($arFields[$arFieldsKeys[$i]]["FROM"], $arAlreadyJoined))
					{
						if ($strSqlFrom <> '')
							$strSqlFrom .= " ";
						$strSqlFrom .= $arFields[$arFieldsKeys[$i]]["FROM"];
						$arAlreadyJoined[] = $arFields[$arFieldsKeys[$i]]["FROM"];
					}
				}
			}
			else
			{
				foreach ($arSelectFields as $key => $val)
				{
					$val = mb_strtoupper($val);
					$key = mb_strtoupper($key);
					if (array_key_exists($val, $arFields))
					{
						if ($strSqlSelect <> '')
							$strSqlSelect .= ", ";

						if (in_array($key, $arGroupByFunct))
							$strSqlSelect .= $key."(".$arFields[$val]["FIELD"].") as ".$val;
						else
						{
							if (($arFields[$val]["TYPE"] ?? null) === "datetime")
							{
								if (array_key_exists($val, $arOrder))
									$strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val."_X1, ";

								$strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"])." as ".$val;
							}
							elseif (($arFields[$val]["TYPE"] ?? null) === "date")
							{
								if (array_key_exists($val, $arOrder))
									$strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val."_X1, ";

								$strSqlSelect .= $DB->DateToCharFunction($arFields[$val]["FIELD"], "SHORT")." as ".$val;
							}
							else
								$strSqlSelect .= $arFields[$val]["FIELD"]." as ".$val;
						}

						if (isset($arFields[$val]["FROM"])
							&& $arFields[$val]["FROM"] <> ''
							&& !in_array($arFields[$val]["FROM"], $arAlreadyJoined))
						{
							if ($strSqlFrom <> '')
								$strSqlFrom .= " ";
							$strSqlFrom .= $arFields[$val]["FROM"];
							$arAlreadyJoined[] = $arFields[$val]["FROM"];
						}
					}
				}
			}

			if ($obUserFieldsSql)
				$strSqlSelect .= ($strSqlSelect == '' ? $arFields["ID"]["FIELD"] : "").$obUserFieldsSql->GetSelect();

			if ($strSqlGroupBy <> '')
			{
				if ($strSqlSelect <> '')
				{
					$strSqlSelect .= ", ";
				}
				$strSqlSelect .= "COUNT(%%_DISTINCT_%% ".$arFields[$arFieldsKeys[0]]["FIELD"].") as CNT";
			}
			else
			{
				$strSqlSelect = "%%_DISTINCT_%% ".$strSqlSelect;
			}
		}
		// <-- SELECT

		if ($obUserFieldsSql)
		{
			$strSqlFrom .= " ".$obUserFieldsSql->GetJoin($arFields["ID"]["FIELD"]);
		}

		return array(
			"SELECT" => $strSqlSelect,
			"FROM" => $strSqlFrom,
			"WHERE" => $strSqlWhere,
			"GROUPBY" => $strSqlGroupBy,
			"ORDERBY" => $strSqlOrderBy
		);
	}

	/***************************************/
	/*************    *************/
	/***************************************/

	public static function GetSite($group_id)
	{
		global $DB;

		if (is_array($group_id))
		{
			if (empty($group_id))
			{
				return false;
			}

			$strVal = "";

			foreach ($group_id as $val)
			{
				if ($strVal <> '')
				{
					$strVal .= ', ';
				}
				$strVal .= intval($val);
			}
			$strSql = "SELECT L.*, SGS.* FROM b_sonet_group_site SGS, b_lang L WHERE L.LID=SGS.SITE_ID AND SGS.GROUP_ID IN (".$strVal.")";
		}
		else
		{
			$strSql = "SELECT L.*, SGS.* FROM b_sonet_group_site SGS, b_lang L WHERE L.LID=SGS.SITE_ID AND SGS.GROUP_ID=".intval($group_id);
		}

		return $DB->Query($strSql);
	}

	public static function GetDefaultSiteId($groupId, $siteId = false)
	{
		$groupSiteId = ($siteId ?: SITE_ID);

		if (CModule::IncludeModule("extranet"))
		{
			$extranetSiteId = CExtranet::GetExtranetSiteID();

			$rsGroupSite = CSocNetGroup::GetSite($groupId);
			while ($arGroupSite = $rsGroupSite->Fetch())
			{
				if (
					!$extranetSiteId
					|| $arGroupSite["LID"] != $extranetSiteId
				)
				{
					$groupSiteId = $arGroupSite["LID"];
					break;
				}
			}
		}

		return $groupSiteId;
	}

	public static function OnBeforeLangDelete($lang): bool
	{
		global $APPLICATION, $DB;
		$r = $DB->Query("
			SELECT GROUP_ID
			FROM b_sonet_group_site
			WHERE SITE_ID='".$DB->ForSQL($lang, 2)."'
			ORDER BY GROUP_ID
		");
		$arSocNetGroups = array();
		while($a = $r->Fetch())
			$arSocNetGroups[] = $a["GROUP_ID"];
		if(count($arSocNetGroups) > 0)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_GROUP_SITE_LINKS_EXISTS", array("#ID_LIST#" => implode(", ", $arSocNetGroups))));
			return false;
		}
		else
			return true;
	}

	public static function SearchIndex($groupId, $arSiteID = array(), $arGroupOld = array()): void
	{
		if (intval($groupId) <= 0)
		{
			return;
		}

		if (CModule::IncludeModule("search"))
		{
			$arGroupNew = CSocNetGroup::GetByID($groupId);
			if ($arGroupNew)
			{
				if (
					$arGroupNew["ACTIVE"] == "N"
					&& isset($arGroupOld)
					&& is_array($arGroupOld)
					&& isset($arGroupOld["ACTIVE"])
					&& $arGroupOld["ACTIVE"] == "Y"
				)
				{
					CSearch::DeleteIndex("socialnetwork", "G".$groupId);
				}
				elseif ($arGroupNew["ACTIVE"] == "Y")
				{
					$BODY = CSocNetTextParser::killAllTags($arGroupNew["~DESCRIPTION"]);
					$BODY .= $GLOBALS["USER_FIELD_MANAGER"]->OnSearchIndex("SONET_GROUP", $groupId);

					$arSearchIndexSiteID = array();
					if (
						is_array($arSiteID)
						&& !empty($arSiteID)
					)
					{
						foreach ($arSiteID as $site_id_tmp)
						{
							$arSearchIndexSiteID[$site_id_tmp] = str_replace("#group_id#", $groupId, Path::get('group_path_template', $site_id_tmp));
						}
					}
					else
					{
						$rsGroupSite = CSocNetGroup::GetSite($groupId);
						while ($arGroupSite = $rsGroupSite->Fetch())
						{
							$arSearchIndexSiteID[$arGroupSite["LID"]] = str_replace("#group_id#", $groupId, Path::get('group_path_template', $arGroupSite['LID']));
						}
					}

					$arSearchIndex = array(
						"SITE_ID" => $arSearchIndexSiteID,
						"LAST_MODIFIED" => $arGroupNew["DATE_ACTIVITY"],
						"PARAM1" => $arGroupNew["SUBJECT_ID"],
						"PARAM2" => $groupId,
						"PARAM3" => "GROUP",
						"PERMISSIONS" => (
							$arGroupNew["VISIBLE"] == "Y"?
								array('G2')://public
								array(
									'SG'.$groupId.'_A',//admins
									'SG'.$groupId.'_E',//moderators
									'SG'.$groupId.'_K',//members
								)
						),
						"PARAMS" =>array(
							"socnet_group" 	=> $groupId,
							"entity" 		=> "socnet_group",
						),
						"TITLE" => $arGroupNew["~NAME"],
						"BODY" => $BODY,
						"TAGS" => $arGroupNew["~KEYWORDS"],
					);

					CSearch::Index("socialnetwork", "G".$groupId, $arSearchIndex, True);
				}
			}
		}
	}

	public static function ConfirmAllRequests($groupId, $bAutoSubscribe = true, $currentUserId = 0)
	{
		$dbRequests = CSocNetUserToGroup::GetList(
			array(),
			array(
				"GROUP_ID" => $groupId,
				"ROLE" => SONET_ROLES_REQUEST,
				"INITIATED_BY_TYPE" => SONET_INITIATED_BY_USER
			),
			false,
			false,
			array("ID")
		);
		if ($dbRequests)
		{
			$arIDs = array();
			while ($arRequests = $dbRequests->GetNext())
			{
				$arIDs[] = $arRequests["ID"];
			}

			if (!$currentUserId)
			{
				$currentUserId = \Bitrix\Socialnetwork\Helper\User::getCurrentUserId();
			}

			CSocNetUserToGroup::ConfirmRequestToBeMember(
				$currentUserId,
				$groupId,
				$arIDs,
				$bAutoSubscribe,
			);
		}
	}

	private static function getTypeByFields(array $fields): Type
	{
		if (isset($fields['SCRUM_MASTER_ID']))
		{
			return Type::Scrum;
		}

		if (($fields['PROJECT'] ?? 'N') === 'Y')
		{
			return Type::Project;
		}

		return Type::getDefault();
	}

}

Youez - 2016 - github.com/yon3zu
LinuXploit