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/mysql/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

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

require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/socialnetwork/classes/general/group.php");

use Bitrix\Socialnetwork\Internals\Registry\GroupRegistry;
use Bitrix\Socialnetwork\Item\Workgroup\Type;
use Bitrix\Socialnetwork\Util;
use Bitrix\Socialnetwork\WorkgroupTable;
use Bitrix\Socialnetwork\WorkgroupSiteTable;
use Bitrix\Socialnetwork\Item\Workgroup;
use Bitrix\Socialnetwork\Item\WorkgroupSubject;
use Bitrix\Socialnetwork\Integration;
use Bitrix\Socialnetwork\WorkgroupTagTable;
use Bitrix\Socialnetwork\Internals\EventService;

class CSocNetGroup extends CAllSocNetGroup
{
	/***************************************/
	/********  DATA MODIFICATION  **********/
	/***************************************/
	public static function Add($arFields)
	{
		global $DB, $CACHE_MANAGER, $USER_FIELD_MANAGER;

		$arFields1 = Util::getEqualityFields($arFields);

		if (!CSocNetGroup::CheckFields("ADD", $arFields))
		{
			return false;
		}

		$arSiteID = [];
		if(array_key_exists("SITE_ID", $arFields))
		{
			if(is_array($arFields["SITE_ID"]))
			{
				foreach($arFields["SITE_ID"] as $site_id)
				{
					$arSiteID[$site_id] = $DB->ForSQL($site_id);
				}
			}
			else
			{
				$arSiteID[$arFields["SITE_ID"]] = $DB->ForSQL($arFields["SITE_ID"]);
			}
		}

		if(empty($arSiteID))
		{
			unset($arFields["SITE_ID"]);
		}
		else
		{
			$arFields["SITE_ID"] = end($arSiteID);
		}

		$arFields["SITE_ID_FULL"] = $arSiteID;
		$db_events = GetModuleEvents("socialnetwork", "OnBeforeSocNetGroupAdd");
		while ($arEvent = $db_events->Fetch())
		{
			if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false)
			{
				return false;
			}
		}
		unset($arFields["SITE_ID_FULL"]);

		if (
			array_key_exists("IMAGE_ID", $arFields)
			&& is_array($arFields["IMAGE_ID"])
			&& (
				!array_key_exists("MODULE_ID", $arFields["IMAGE_ID"])
				|| $arFields["IMAGE_ID"]["MODULE_ID"] == ''
			)
		)
		{
			$arFields["IMAGE_ID"]["MODULE_ID"] = "socialnetwork";
		}

		CFile::SaveForDB($arFields, "IMAGE_ID", "socialnetwork");

		$arInsert = $DB->PrepareInsert("b_sonet_group", $arFields);
		Util::processEqualityFieldsToInsert($arFields1, $arInsert);

		$ID = false;
		if ($arInsert[0] <> '')
		{
			$strSql =
				"INSERT INTO b_sonet_group(".$arInsert[0].") ".
				"VALUES(".$arInsert[1].")";
			$DB->Query($strSql);

			$ID = (int)$DB->LastID();

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

			if ($ID > 0)
			{
				EventService\Service::addEvent(EventService\EventDictionary::EVENT_WORKGROUP_ADD, [
					'GROUP_ID' => $ID,
				]);

				if(!empty($arSiteID))
				{
					$DB->Query("
						DELETE FROM b_sonet_group_site WHERE GROUP_ID = ".$ID."
					");

					$DB->Query("
						INSERT INTO b_sonet_group_site(GROUP_ID, SITE_ID)
						SELECT ".$ID.", LID
						FROM b_lang
						WHERE LID IN ('".implode("', '", $arSiteID)."')
					");

					if (intval($arFields["SUBJECT_ID"]) > 0)
					{
						WorkgroupSubject::syncSiteId(array(
							'subjectId' => $arFields["SUBJECT_ID"],
							'siteId' => $arSiteID
						));
					}
				}

				if(defined("BX_COMP_MANAGED_CACHE"))
				{
					$CACHE_MANAGER->ClearByTag("sonet_group");
				}

				$USER_FIELD_MANAGER->Update("SONET_GROUP", $ID, $arFields);
				CSocNetGroup::SearchIndex($ID, $arSiteID);
				if (!empty($arFields["KEYWORDS"]))
				{
					$tagsList = explode(',', $arFields["KEYWORDS"]);
					if (
						!empty($tagsList)
						&& is_array($tagsList)
					)
					{
						$tagsList = array_map(function($a) { return trim($a, ' '); }, $tagsList);
						$tagsList = array_filter($tagsList, function($a) { return ($a <> ''); });
					}
					if (
						!empty($tagsList)
						&& is_array($tagsList)
					)
					{
						WorkgroupTagTable::set([
							'groupId' => $ID,
							'tags' => $tagsList
						]);
					}
				}

				Workgroup::setIndex(array(
					'fields' => $arFields
				));

				$groupItem = Workgroup::getById($ID, false);
				$groupItem->syncDeptConnection();

				GroupRegistry::getInstance()->invalidate($ID);
			}
		}

		return $ID;
	}

	public static function Update($ID, $arFields, $bAutoSubscribe = true, $bClearCommonTag = true, $bSync = true)
	{
		global $DB, $APPLICATION, $CACHE_MANAGER, $USER_FIELD_MANAGER;

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

		$ID = (int)$ID;

		$arGroupOld = CSocNetGroup::GetByID($ID);
		if (!$arGroupOld)
		{
			$APPLICATION->ThrowException(GetMessage("SONET_NO_GROUP"), "ERROR_NO_GROUP");
			return false;
		}

		$arFields['TYPE'] ??= static::getGroupTypeByFields($arFields, $arGroupOld)->value;

		$arFields1 = Util::getEqualityFields($arFields);

		if (!CSocNetGroup::CheckFields("UPDATE", $arFields, $ID))
		{
			return false;
		}

		$arSiteID = [];

		if (is_set($arFields, "SITE_ID"))
		{
			if(is_array($arFields["SITE_ID"]))
			{
				$arSiteID = $arFields["SITE_ID"];
			}
			else
			{
				$arSiteID[] = $arFields["SITE_ID"];
			}

			$arFields["SITE_ID"] = false;
			$str_SiteID = "''";
			foreach($arSiteID as $v)
			{
				$arFields["SITE_ID"] = $v;
				$str_SiteID .= ", '".$DB->ForSql($v)."'";
			}
		}

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

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

		if (
			array_key_exists("IMAGE_ID", $arFields)
			&& is_array($arFields["IMAGE_ID"])
			&& (
				!array_key_exists("MODULE_ID", $arFields["IMAGE_ID"])
				|| $arFields["IMAGE_ID"]["MODULE_ID"] == ''
			)
		)
		{
			$arFields["IMAGE_ID"]["MODULE_ID"] = "socialnetwork";
		}

		CFile::SaveForDB($arFields, "IMAGE_ID", "socialnetwork");

		$strUpdate = $DB->PrepareUpdate("b_sonet_group", $arFields);
		Util::processEqualityFieldsToUpdate($arFields1, $strUpdate);

		if ($strUpdate <> '')
		{
			$strSql =
				"UPDATE b_sonet_group SET ".
				"	".$strUpdate." ".
				"WHERE ID = ".$ID." ";
			$DB->Query($strSql);

			if(!empty($arSiteID))
			{
				$strSql = "DELETE FROM b_sonet_group_site WHERE GROUP_ID=".$ID;
				$DB->Query($strSql);

				$strSql =
					"INSERT INTO b_sonet_group_site(GROUP_ID, SITE_ID) ".
					"SELECT ".$ID.", LID ".
					"FROM b_lang ".
					"WHERE LID IN (".$str_SiteID.") ";
				$DB->Query($strSql);

				$arLogID = array();

				$dbResult = CSocNetLog::GetList(
					array(),
					array("LOG_RIGHTS" => "SG".$ID),
					false,
					false,
					array("ID")
				);

				while ($arResult = $dbResult->Fetch())
				{
					$DB->Query("DELETE FROM b_sonet_log_site WHERE LOG_ID = ".$arResult["ID"]."");

					$DB->Query("
						INSERT INTO b_sonet_log_site(LOG_ID, SITE_ID)
						SELECT ".$arResult["ID"].", LID
						FROM b_lang
						WHERE LID IN (".$str_SiteID.")
					");

					$arLogID[] = $arResult["ID"];
				}
			}

			if (
				!empty($arSiteID)
				|| intval($arFields["SUBJECT_ID"] ?? 0) > 0
			)
			{
				$subjectId = 0;
				$groupSiteList = array();

				if (intval($arFields["SUBJECT_ID"] ?? 0) <= 0)
				{
					$res = WorkgroupTable::getList(array(
						'filter' => array('=ID' => $ID),
						'select' => array('SUBJECT_ID')
					));
					if ($workgroupFieldsList = $res->fetch())
					{
						$subjectId = intval($workgroupFieldsList["SUBJECT_ID"]);
					}
				}
				else
				{
					$subjectId = intval($arFields["SUBJECT_ID"]);
				}

				if (empty($arSiteID))
				{
					$res = WorkgroupSiteTable::getList(array(
						'filter' => array('=GROUP_ID' => $ID),
						'select' => array('SITE_ID')
					));
					while ($workgroupSiteFieldsList = $res->fetch())
					{
						$groupSiteList[] = intval($workgroupSiteFieldsList["SITE_ID"]);
					}
				}
				else
				{
					$groupSiteList = $arSiteID;
				}

				if (
					$subjectId > 0
					&& !empty($groupSiteList)
				)
				{
					WorkgroupSubject::syncSiteId(array(
						'subjectId' => $subjectId,
						'siteId' => $groupSiteList
					));
				}
			}

			$sonetGroupCache = self::getStaticCache();
			unset($sonetGroupCache[$ID]);
			self::setStaticCache($sonetGroupCache);

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

			$USER_FIELD_MANAGER->Update("SONET_GROUP", $ID, $arFields);

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

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

			CSocNetGroup::SearchIndex($ID, false, $arGroupOld);

			if (isset($arFields['KEYWORDS']))
			{
				$tagsList = explode(',', $arFields["KEYWORDS"]);
				if (
					!empty($tagsList)
					&& is_array($tagsList)
				)
				{
					$tagsList = array_map(function($a) { return trim($a, ' '); }, $tagsList);
					$tagsList = array_filter($tagsList, function($a) { return ($a <> ''); });
				}

				WorkgroupTagTable::set([
					'groupId' => $ID,
					'tags' => $tagsList
				]);
			}

			Workgroup::setIndex(array(
				'fields' => array_merge($arFields, array('ID' => $ID))
			));

			$arGroupNew = CSocNetGroup::GetByID($ID);
			if (
				$arGroupNew['OPENED'] === 'Y'
				&& $arGroupOld['OPENED'] === 'N'
			)
			{
				CSocNetGroup::ConfirmAllRequests($ID, $bAutoSubscribe, $arFields['INITIATED_BY_USER_ID'] ?? 0);
			}

			$isCollab = $arGroupNew['TYPE'] === Workgroup\Type::Collab->value;

			if ($isCollab)
			{
				$chatData = Integration\Im\Chat\Workgroup::getChatData(['group_id' => $ID]);

				$chatId = $chatData[$ID] ?? null;

				if ($chatId > 0)
				{
					$fields = [];
					if (array_key_exists('NAME', $arFields))
					{
						$fields['TITLE'] = $arFields['NAME'];
					}
					if (array_key_exists('DESCRIPTION', $arFields))
					{
						$fields['DESCRIPTION'] = $arFields['DESCRIPTION'];
					}
					if (array_key_exists('IMAGE_ID', $arFields))
					{
						$fields['AVATAR'] = (int)$arFields['IMAGE_ID'];
					}
					if (array_key_exists('OWNER_ID', $arFields))
					{
						$fields['OWNER_ID'] = $arFields['OWNER_ID'];
					}

					if (!empty($fields))
					{
						\Bitrix\Socialnetwork\Collab\Integration\IM\Messenger::synchronizeCollabChat($chatId, $fields);
					}
				}
			}
			elseif (
				!empty($arFields["NAME"])
				|| !empty($arFields["IMAGE_ID"])
				|| !empty($arFields["OWNER_ID"])
				|| !empty($arFields["DESCRIPTION"])
			)
			{
				$chatData = Integration\Im\Chat\Workgroup::getChatData(array(
					'group_id' => $ID
				));

				if (
					!empty($chatData)
					&& !empty($chatData[$ID])
					&& intval($chatData[$ID]) > 0
				)
				{
					$chatId = $chatData[$ID];

					$chat = new CIMChat(0);

					if(!empty($arFields["NAME"]))
					{
						$chat->rename(
							$chatId,
							Integration\Im\Chat\Workgroup::buildChatName($arFields["NAME"], [
								'project' => $arGroupNew["PROJECT"] === 'Y',
								'type' => $arGroupNew['TYPE'] ?? ''
							]),
							false,
							false
						);
					}

					if(!empty($arFields["IMAGE_ID"]))
					{
						$chat->setAvatarId($chatId, $arFields['IMAGE_ID']);
					}

					if(!empty($arFields["OWNER_ID"]))
					{
						$chat->setOwner($chatId, $arFields["OWNER_ID"], false);
					}

					if (!empty($arFields["DESCRIPTION"]))
					{
						$chat->SetDescription($chatId, $arFields["DESCRIPTION"]);
					}
				}
			}
		}
		else
		{
			if($USER_FIELD_MANAGER->Update("SONET_GROUP", $ID, $arFields))
			{
				if(defined("BX_COMP_MANAGED_CACHE"))
				{
					if ($bClearCommonTag)
					{
						$CACHE_MANAGER->ClearByTag("sonet_group");
					}
					$CACHE_MANAGER->ClearByTag("sonet_group_".$ID);
				}
			}
			else
			{
				$ID = False;
			}
		}

		if ($ID && $bSync)
		{
			$groupItem = Workgroup::getById($ID, false);
			$groupItem->syncDeptConnection();
		}

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

		return $ID;
	}

	/***************************************/
	/**********  DATA SELECTION  ***********/
	/***************************************/
	public static function GetList($arOrder = Array("ID" => "DESC"), $arFilter = Array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array())
	{
		global $DB, $USER_FIELD_MANAGER;

		if (count($arSelectFields) <= 0)
			$arSelectFields = array("ID", "SITE_ID", "NAME", "DESCRIPTION", "DATE_CREATE", "DATE_UPDATE", "ACTIVE", "VISIBLE", "OPENED", "CLOSED", "SUBJECT_ID", "OWNER_ID", "KEYWORDS", "IMAGE_ID", "NUMBER_OF_MEMBERS", "INITIATE_PERMS", "SPAM_PERMS", "DATE_ACTIVITY", "SUBJECT_NAME", "PROJECT");

		static $arFields1 = array(
			"ID" => Array("FIELD" => "G.ID", "TYPE" => "int"),
			"NAME" => Array("FIELD" => "G.NAME", "TYPE" => "string"),
			"DESCRIPTION" => Array("FIELD" => "G.DESCRIPTION", "TYPE" => "string"),
			"DATE_CREATE" => Array("FIELD" => "G.DATE_CREATE", "TYPE" => "datetime"),
			"DATE_UPDATE" => Array("FIELD" => "G.DATE_UPDATE", "TYPE" => "datetime"),
			"DATE_ACTIVITY" => Array("FIELD" => "G.DATE_ACTIVITY", "TYPE" => "datetime"),
			"ACTIVE" => Array("FIELD" => "G.ACTIVE", "TYPE" => "string"),
			"VISIBLE" => Array("FIELD" => "G.VISIBLE", "TYPE" => "string"),
			"OPENED" => Array("FIELD" => "G.OPENED", "TYPE" => "string"),
			"CLOSED" => Array("FIELD" => "G.CLOSED", "TYPE" => "string"),
			"SUBJECT_ID" => Array("FIELD" => "G.SUBJECT_ID", "TYPE" => "int"),
			"OWNER_ID" => Array("FIELD" => "G.OWNER_ID", "TYPE" => "int"),
			"KEYWORDS" => Array("FIELD" => "G.KEYWORDS", "TYPE" => "string"),
			"IMAGE_ID" => Array("FIELD" => "G.IMAGE_ID", "TYPE" => "int"),
			"NUMBER_OF_MEMBERS" => Array("FIELD" => "G.NUMBER_OF_MEMBERS", "TYPE" => "int"),
			"NUMBER_OF_MODERATORS" => Array("FIELD" => "G.NUMBER_OF_MODERATORS", "TYPE" => "int"),
			"INITIATE_PERMS" => Array("FIELD" => "G.INITIATE_PERMS", "TYPE" => "string"),
			"SPAM_PERMS" => Array("FIELD" => "G.SPAM_PERMS", "TYPE" => "string"),
			"SUBJECT_NAME" => Array("FIELD" => "S.NAME", "TYPE" => "string", "FROM" => "INNER JOIN b_sonet_group_subject S ON (G.SUBJECT_ID = S.ID)"),
			"OWNER_NAME" => Array("FIELD" => "U.NAME", "TYPE" => "string", "FROM" => "INNER JOIN b_user U ON (G.OWNER_ID = U.ID)"),
			"OWNER_LAST_NAME" => Array("FIELD" => "U.LAST_NAME", "TYPE" => "string", "FROM" => "INNER JOIN b_user U ON (G.OWNER_ID = U.ID)"),
			"OWNER_LOGIN" => Array("FIELD" => "U.LOGIN", "TYPE" => "string", "FROM" => "INNER JOIN b_user U ON (G.OWNER_ID = U.ID)"),
			"OWNER_EMAIL" => Array("FIELD" => "U.EMAIL", "TYPE" => "string", "FROM" => "INNER JOIN b_user U ON (G.OWNER_ID = U.ID)"),
			"OWNER_USER" => array("FIELD" => "U.LOGIN,U.NAME,U.LAST_NAME,U.EMAIL,U.ID", "WHERE_ONLY" => "Y", "TYPE" => "string", "FROM" => "INNER JOIN b_user U ON (G.OWNER_ID = U.ID)"),
			"PROJECT" => Array("FIELD" => "G.PROJECT", "TYPE" => "string"),
			"PROJECT_DATE_START" => Array("FIELD" => "G.PROJECT_DATE_START", "TYPE" => "datetime"),
			"PROJECT_DATE_FINISH" => Array("FIELD" => "G.PROJECT_DATE_FINISH", "TYPE" => "datetime"),
			"LANDING" => Array("FIELD" => "G.LANDING", "TYPE" => "string"),
			"SCRUM_OWNER_ID" => ["FIELD" => "G.SCRUM_OWNER_ID", "TYPE" => "int"],
			"SCRUM_MASTER_ID" => ["FIELD" => "G.SCRUM_MASTER_ID", "TYPE" => "int"],
			"SCRUM_SPRINT_DURATION" => ["FIELD" => "G.SCRUM_SPRINT_DURATION", "TYPE" => "int"],
			"SCRUM_TASK_RESPONSIBLE" => ["FIELD" => "G.SCRUM_TASK_RESPONSIBLE", "TYPE" => "string"],
			'AVATAR_TYPE' => [ 'FIELD' => 'G.AVATAR_TYPE', 'TYPE' => 'string'],
			'TYPE' => ['FIELD' => 'G.TYPE', 'TYPE' => 'string']
		);

		if (array_key_exists("SITE_ID", $arFilter))
		{
			$arFields["SITE_ID"] = Array("FIELD" => "SGS.SITE_ID", "TYPE" => "string", "FROM" => "LEFT JOIN b_sonet_group_site SGS ON G.ID = SGS.GROUP_ID");
			$strDistinct = " DISTINCT ";
			foreach ($arSelectFields as $i => $strFieldTmp)
			{
				if ($strFieldTmp === "SITE_ID")
				{
					unset($arSelectFields[$i]);
				}
			}

			foreach ($arOrder as $by => $order)
			{
				if (!in_array($by, $arSelectFields))
				{
					$arSelectFields[] = $by;
				}
			}
		}
		else
		{
			$arFields["SITE_ID"] = Array("FIELD" => "G.SITE_ID", "TYPE" => "string");
			$strDistinct = " ";
		}

		$arFields = array_merge($arFields1, $arFields);
		$arSqls = CSocNetGroup::PrepareSql($arFields, $arOrder, $arFilter, $arGroupBy, $arSelectFields, array("ENTITY_ID" => "SONET_GROUP"));
		$arSqls["SELECT"] = str_replace("%%_DISTINCT_%%", $strDistinct, $arSqls["SELECT"]);

		if (is_array($arGroupBy) && count($arGroupBy)==0)
		{
			$strSql =
				"SELECT ".$arSqls["SELECT"]." ".
				"FROM b_sonet_group G ".
				"	".$arSqls["FROM"]." ";
			if ($arSqls["WHERE"] <> '')
			{
				$strSql .= "WHERE ".$arSqls["WHERE"]." ";
			}
			if ($arSqls["GROUPBY"] <> '')
			{
				$strSql .= "GROUP BY ".$arSqls["GROUPBY"]." ";
			}

			//echo "!1!=".htmlspecialcharsbx($strSql)."<br>";

			$dbRes = $DB->Query($strSql);
			if ($arRes = $dbRes->Fetch())
				return $arRes["CNT"];
			else
				return False;
		}

		$checkPermissions = Array_Key_Exists("CHECK_PERMISSIONS", $arFilter);

		if ($checkPermissions)
		{
			$strSql =
				"SELECT ".$arSqls["SELECT"]." ".
				"FROM b_sonet_group G ".
				"	".$arSqls["FROM"]." ".
				"WHERE G.VISIBLE = 'Y' ";
			if ($arSqls["WHERE"] <> '')
			{
				$strSql .= "AND ".$arSqls["WHERE"]." ";
			}

			$strSql .= "UNION ".
				"SELECT ".$arSqls["SELECT"]." ".
				"FROM b_sonet_group G ".
				"	INNER JOIN b_sonet_user2group UG ON (G.ID = UG.GROUP_ID AND UG.USER_ID = ".intval($arFilter["CHECK_PERMISSIONS"])." AND UG.ROLE <= '".$DB->ForSql(SONET_ROLES_USER, 1)."') ".
				"	".$arSqls["FROM"]." ".
				"WHERE G.VISIBLE = 'N' ";
			if ($arSqls["WHERE"] <> '')
				$strSql .= "AND ".$arSqls["WHERE"]." ";
			$strSql .= " ";

			if ($arSqls["GROUPBY"] <> '')
			{
				$strSql .= "GROUP BY ".$arSqls["GROUPBY"]." ";
			}

			if ($arSqls["ORDERBY"] <> '')
			{
				$strSql .= "ORDER BY ".Str_Replace(array(" G.", " UG.", " S."), array(" ", " ", " "), " ".$arSqls["ORDERBY"])." ";
			}
		}
		else
		{
			$strSql =
				"SELECT ".$arSqls["SELECT"]." ".
				"FROM b_sonet_group G ".
				"	".$arSqls["FROM"]." ";
			if ($arSqls["WHERE"] <> '')
			{
				$strSql .= "WHERE ".$arSqls["WHERE"]." ";
			}
			if ($arSqls["GROUPBY"] <> '')
			{
				$strSql .= "GROUP BY ".$arSqls["GROUPBY"]." ";
			}
			if ($arSqls["ORDERBY"] <> '')
			{
				$strSql .= "ORDER BY ".$arSqls["ORDERBY"]." ";
			}
		}

		if (
			is_array($arNavStartParams)
			&& intval($arNavStartParams["nTopCount"] ?? null) <= 0
		)
		{
			$strSql_tmp =
				"SELECT COUNT('x') as CNT ".
				"FROM b_sonet_group G ".
				"	".$arSqls["FROM"]." ";
			if (
				$arSqls["WHERE"] <> ''
				|| $checkPermissions
			)
			{
				$strSql_tmp .= "WHERE ".($checkPermissions ? "G.VISIBLE = 'Y'" : "1 = 1").($arSqls["WHERE"] <> '' ? " AND " : "").$arSqls["WHERE"]." ";
			}
			if ($arSqls["GROUPBY"] <> '')
			{
				$strSql_tmp .= "GROUP BY ".$arSqls["GROUPBY"]." ";
			}

			//echo "!2.1!=".htmlspecialcharsbx($strSql_tmp)."<br>";

			$dbRes = $DB->Query($strSql_tmp);
			$cnt = 0;
			if ($arSqls["GROUPBY"] == '')
			{
				if ($arRes = $dbRes->Fetch())
				{
					$cnt = $arRes["CNT"];
				}
			}
			else
			{
				// ТОЛЬКО ДЛЯ MYSQL!!! ДЛЯ ORACLE ДРУГОЙ КОД
				$cnt = $dbRes->SelectedRowsCount();
			}

			if ($checkPermissions)
			{
				$strSql_tmp =
					"SELECT COUNT('x') as CNT ".
					"FROM b_sonet_group G ".
					"	INNER JOIN b_sonet_user2group UG ON (G.ID = UG.GROUP_ID AND UG.USER_ID = ".intval($arFilter["CHECK_PERMISSIONS"])." AND UG.ROLE <= '".$DB->ForSql(SONET_ROLES_USER, 1)."') ".
					"	".$arSqls["FROM"]." ".
					"WHERE G.VISIBLE = 'N' ";
				if ($arSqls["WHERE"] <> '')
				{
					$strSql_tmp .= "AND ".$arSqls["WHERE"]." ";
				}
				if ($arSqls["GROUPBY"] <> '')
				{
					$strSql_tmp .= "GROUP BY ".$arSqls["GROUPBY"]." ";
				}

				//echo "!2.2!=".htmlspecialcharsbx($strSql_tmp)."<br>";

				$dbRes = $DB->Query($strSql_tmp);
				if ($arSqls["GROUPBY"] == '')
				{
					if ($arRes = $dbRes->Fetch())
					{
						$cnt += $arRes["CNT"];
					}
				}
				else
				{
					// ТОЛЬКО ДЛЯ MYSQL!!! ДЛЯ ORACLE ДРУГОЙ КОД
					$cnt += $dbRes->SelectedRowsCount();
				}
			}

			$dbRes = new CDBResult();

			//echo "!2.3!=".htmlspecialcharsbx($strSql)."<br>";

			$dbRes->SetUserFields($USER_FIELD_MANAGER->GetUserFields("SONET_GROUP"));
			$dbRes->NavQuery($strSql, $cnt, $arNavStartParams);
		}
		else
		{
			if (
				is_array($arNavStartParams)
				&& intval($arNavStartParams["nTopCount"]) > 0
			)
			{
				$strSql .= "LIMIT ".intval($arNavStartParams["nTopCount"]);
			}

			//echo "!3!=".htmlspecialcharsbx($strSql)."<br>";

			$dbRes = $DB->Query($strSql);
			$dbRes->SetUserFields($USER_FIELD_MANAGER->GetUserFields("SONET_GROUP"));
		}

		return $dbRes;
	}

	private static function getGroupTypeByFields(array $fields, array $oldFields): Type
	{
		if (($oldFields['TYPE'] ?? null) === Type::Collab->value)
		{
			return Type::Collab;
		}

		if (isset($fields['SCRUM_MASTER_ID']))
		{
			return Type::Scrum;
		}

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

		return Type::tryFrom($oldFields['TYPE']) ?? Type::getDefault();
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit