Your IP : 18.188.100.195


Current Path : /var/www/axolotl/data/www/nn.axolotls.ru/bitrix/modules/crm/lib/sitebutton/
Upload File :
Current File : /var/www/axolotl/data/www/nn.axolotls.ru/bitrix/modules/crm/lib/sitebutton/manager.php

<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage intranet
 * @copyright 2001-2016 Bitrix
 */

namespace Bitrix\Crm\SiteButton;

use Bitrix\Main\Loader;
use Bitrix\Main\ModuleManager;
use Bitrix\Main\Application;
use Bitrix\Main\Config\Option;
use Bitrix\Main\Localization\Loc;
use Bitrix\Imopenlines;

Loc::loadMessages(__FILE__);

/**
 * Class Manager
 * @package Bitrix\Crm\SiteButton
 */
class Manager
{
	const ENUM_TYPE_OPEN_LINE = 'openline';
	const ENUM_TYPE_CRM_FORM = 'crmform';
	const ENUM_TYPE_CALLBACK = 'callback';

	protected static $selectWidgets = true;

	public static function canUseOpenLine()
	{
		return ChannelManager::canUse(self::ENUM_TYPE_OPEN_LINE);
	}

	public static function canUseCrmForm()
	{
		return ChannelManager::canUse(self::ENUM_TYPE_CRM_FORM);
	}

	public static function canUseCallback()
	{
		return ChannelManager::canUse(self::ENUM_TYPE_CALLBACK);
	}

	public static function getTypeList()
	{
		return ChannelManager::getTypeNames();
	}

	public static function getWidgetByTypeId($typeId)
	{
		$types = self::getTypeList();
		if (isset($types[$typeId]))
		{
			return $types[$typeId];
		}
		else
		{
			return null;
		}
	}

	/**
	 * @internal
	 */
	public static function disableWidgetSelect()
	{
		self::$selectWidgets = false;
	}

	/**
	 * @internal
	 */
	public static function isWidgetSelectDisabled()
	{
		return !self::$selectWidgets;
	}

	public static function getWidgetList()
	{
		static $list = null;

		if ($list !== null)
		{
			return $list;
		}

		$list = array();
		$types = ChannelManager::getTypes();
		foreach ($types as $type)
		{
			$item = ChannelManager::getChannelArray($type);
			if ($item)
			{
				$list[] = $item;
			}
		}

		return $list;
	}

	/**
	 * Returns language list
	 *
	 * @return array
	 */
	public static function getLanguages()
	{
		$list = array();
		if (ModuleManager::isModuleInstalled("bitrix24"))
		{
			global $b24Languages;
			$fileName = Application::getDocumentRoot() . SITE_TEMPLATE_PATH . "/languages.php";
			include_once $fileName;
			if (isset($b24Languages) && is_array($b24Languages))
			{
				$list = \Bitrix\Main\Text\Encoding::convertEncoding($b24Languages, 'UTF-8', SITE_CHARSET);
			}
		}
		else
		{
			$langDir = Application::getDocumentRoot() . '/bitrix/modules/crm/lang/';
			$dir = new \Bitrix\Main\IO\Directory($langDir);
			if ($dir->isExists())
			{
				foreach($dir->getChildren() as $childDir)
				{
					if (!$childDir->isDirectory())
					{
						continue;
					}

					$list[] = $childDir->getName();
				}

				if (count($list) > 0)
				{
					$listDb = \Bitrix\Main\Localization\LanguageTable::getList(array(
						'select' => array('LID', 'NAME'),
						'filter' => array(
							'=LID' => $list,
							'=ACTIVE' => 'Y'
						),
						'order' => array('SORT' => 'ASC')
					));
					$list = array();
					while ($item = $listDb->fetch())
					{
						$list[$item['LID']] = array("NAME" => $item['NAME']);
					}
				}
			}
		}

		return $list;
	}

	/**
	 * Returns avatars file list
	 *
	 * @return array
	 */
	public static function getAvatars()
	{
		$list = array();
		$listDb = Internals\AvatarTable::getList(array(
			'order' => array('DATE_CREATE' => 'DESC')
		));
		while ($item = $listDb->fetch())
		{
			$file = \CFile::getFileArray($item['FILE_ID']);
			if (!$file)
			{
				continue;
			}

			$image = \CFile::resizeImageGet(
				$file,
				array('width' => 100, 'height' => 100),
				BX_RESIZE_IMAGE_PROPORTIONAL, false
			);
			if($image['src'])
			{
				$path = $image['src'];
			}
			else
			{
				$path = \CFile::getFileSRC($file);
			}

			if (substr($path, 0, 1) == '/')
			{
				$path = ResourceManager::getServerAddress() . $path;
			}

			$list[] = array(
				'ID' => $item['FILE_ID'],
				'PATH' => $path
			);
		}

		return $list;
	}

	public static function updateScriptCacheWithForm($formId)
	{
		$buttons = Internals\ButtonTable::getList(['filter' => ['=ACTIVE' => 'Y']]);
		foreach ($buttons as $buttonData)
		{
			$button = new Button();
			$button->loadByData($buttonData);
			if (in_array($formId, $button->getWebFormIdList()))
			{
				Script::saveCache($button);
			}
		}
	}

	public static function updateScriptCache($fromButtonId = null)
	{
		$filter = array();
		if ($fromButtonId)
		{
			$filter['>=ID'] = $fromButtonId;
		}
		$buttonDb = Internals\ButtonTable::getList(array(
			'filter' => $filter,
			'order' => array('ID' => 'ASC')
		));
		while($buttonData = $buttonDb->fetch())
		{
			$button = new Button();
			$button->loadByData($buttonData);
			if (!Script::saveCache($button))
			{
				return $buttonData['ID'];
			}
		}

		return null;
	}

	public static function updateScriptCacheAgent($fromButtonId = null)
	{
		/*@var $USER CUser*/
		global $USER;
		if (!is_object($USER))
		{
			$USER = new \CUser();
		}

		$resultButtonId = self::updateScriptCache($fromButtonId);
		if ($resultButtonId)
		{
			return '\\Bitrix\\Crm\\SiteButton\\Manager::updateScriptCacheAgent(' . $resultButtonId . ');';
		}
		else
		{
			return '';
		}
	}

	public static function onImConnectorChange()
	{
		static $isAdded = false;
		if ($isAdded)
		{
			return;
		}

		$isAdded = true;
		\CAgent::addAgent('\\Bitrix\\Crm\\SiteButton\\Manager::updateScriptCacheAgent();', "crm", "N", 60, "", "Y", \ConvertTimeStamp(time()+\CTimeZone::getOffset(), "FULL"));
	}

	public static function getList($params = array('order' => array('ID' => 'DESC'), 'cache' => array('ttl' => 36000)))
	{
		$result = array();
		$typeList = self::getTypeList();
		$locationList = Internals\ButtonTable::getLocationList();
		$buttonDb = Internals\ButtonTable::getList($params);
		$domain = \Bitrix\Crm\WebForm\Script::getDomain();
		while($buttonData = $buttonDb->fetch())
		{
			$button = new Button();
			$button->loadByData($buttonData);

			$buttonData['IS_PAGES_USED'] = false;
			$items = array();
			foreach ($typeList as $typeId => $typeName)
			{
				if ($button->hasActiveItem($typeId))
				{
					$item = $button->getItemByType($typeId);
					$items[$typeId] = array(
						'ID' => $item['EXTERNAL_ID'],
						'NAME' => $item['EXTERNAL_NAME'],
						'TYPE_NAME' => $typeName,
					);
				}

				$buttonData['IS_PAGES_USED'] = $buttonData['IS_PAGES_USED'] || $button->hasItemPages($typeId);
			}
			$buttonData['ITEMS'] = $items;

			if ($buttonData['IS_PAGES_USED'])
			{
				$buttonData['PAGES_USE_DISPLAY'] = Loc::getMessage('CRM_BUTTON_MANAGER_PAGES_USE_DISPLAY_USER');
			}
			else
			{
				$buttonData['PAGES_USE_DISPLAY'] = Loc::getMessage('CRM_BUTTON_MANAGER_PAGES_USE_DISPLAY_ALL');
			}


			$buttonData['LOCATION_DISPLAY'] = $locationList[$buttonData['LOCATION']];
			$buttonData['PATH_EDIT'] = $domain . str_replace(
				'#id#',
				$buttonData['ID'],
				Option::get('crm', 'path_to_button_edit', '/crm/button/edit/#id#/')
			);
			$buttonData['SCRIPT'] = Script::getScript($button);
			$result[] = $buttonData;
		}

		return $result;
	}

	/**
	 * Is button in use
	 * @return bool
	 */
	public static function isInUse()
	{
		$resultDb = Internals\ButtonTable::getList(array(
			'select' => array('ID'),
			'limit' => 1
		));
		if ($resultDb->fetch())
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	/**
	 * Is button with callback in use
	 * @return bool
	 */
	public static function isCallbackInUse()
	{
		return \Bitrix\Crm\WebForm\Manager::isInUse('Y');
	}

	/**
	 * Check read permissions
	 * @param null|\CCrmAuthorizationHelper $userPermissions User permissions.
	 * @return bool
	 */
	public static function checkReadPermission($userPermissions = null)
	{
		return \CCrmAuthorizationHelper::CheckReadPermission('BUTTON', 0, $userPermissions);
	}

	/**
	 * Check write permissions
	 * @param null|\CCrmAuthorizationHelper $userPermissions User permissions.
	 * @return bool
	 */
	public static function checkWritePermission($userPermissions = null)
	{
		return \CCrmAuthorizationHelper::CheckUpdatePermission('BUTTON', 0, $userPermissions);
	}

	/**
	 * Get path to button list page
	 * @return string
	 */
	public static function getUrl()
	{
		return Option::get('crm', 'path_to_button_list', '/crm/button/');
	}

	/**
	 * Can remove copyright
	 * @return bool
	 */
	public static function canRemoveCopyright()
	{
		if(!Loader::includeModule('bitrix24'))
		{
			return true;
		}

		if(\CBitrix24::IsDemoLicense())
		{
			return true;
		}

		return \CBitrix24::IsLicensePaid();
	}

	/**
	 * Can use multi lines.
	 * @return bool
	 */
	public static function canUseMultiLines()
	{
		if(!Loader::includeModule('bitrix24'))
		{
			return true;
		}

		if(!Loader::includeModule('imopenlines'))
		{
			return false;
		}

		return Imopenlines\Limit::getLinesLimit() != 1;
	}

	/**
	 * Event handler of changing licence
	 * @return void
	 */
	public static function onBitrix24LicenseChange($licenseType)
	{
		if ($licenseType)
		{
			$isChanged = false;
			if(!self::canRemoveCopyright())
			{
				$buttonDb = Internals\ButtonTable::getList(array('select' => array('ID')));
				while($buttonData = $buttonDb->fetch())
				{
					$button = new Button($buttonData['ID']);
					$data = $button->getData();
					if ($data['SETTINGS']['COPYRIGHT_REMOVED'] == 'Y')
					{
						$data['SETTINGS']['COPYRIGHT_REMOVED'] = 'N';
						$updateResult = Internals\ButtonTable::update(
							$buttonData['ID'],
							array('SETTINGS' => $data['SETTINGS'])
						);
						$isChanged = $updateResult->isSuccess();
					}
				}

				if ($isChanged)
				{
					\CAgent::addAgent('\\Bitrix\\Crm\\SiteButton\\Manager::updateScriptCacheAgent();', "crm", "N", 60, "", "Y", \ConvertTimeStamp(time()+\CTimeZone::getOffset()+60, "FULL"));
				}
			}
		}
	}

	/**
	 * Get plain button list.
	 *
	 * @return array
	 */
	public static function getListPlain()
	{
		$parameters = array();
		$parameters["cache"] = array("ttl" => 3600);
		return Internals\ButtonTable::getList($parameters)->fetchAll();
	}

	/**
	 * Get list form names list.
	 *
	 * @return array
	 */
	public static function getListNames()
	{
		static $result = null;
		if (!is_array($result))
		{
			$result = array();
			$list = self::getListPlain();
			foreach ($list as $item)
			{
				$result[$item['ID']] = $item['NAME'];
			}
		}

		return $result;
	}
}