Your IP : 3.148.232.123


Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/tasks/install/
Upload File :
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/tasks/install/index.php

<?
global $MESS;

IncludeModuleLangFile(__FILE__);

Class tasks extends CModule
{
	var $MODULE_ID = "tasks";
	var $MODULE_VERSION;
	var $MODULE_VERSION_DATE;
	var $MODULE_NAME;
	var $MODULE_DESCRIPTION;
	var $MODULE_CSS;
	var $errors;

	function tasks()
	{
		$arModuleVersion = array();

		include(__DIR__.'/version.php');

		if (is_array($arModuleVersion) && array_key_exists("VERSION", $arModuleVersion))
		{
			$this->MODULE_VERSION = $arModuleVersion["VERSION"];
			$this->MODULE_VERSION_DATE = $arModuleVersion["VERSION_DATE"];
		}
		else
		{
			$this->MODULE_VERSION = TASKS_VERSION;
			$this->MODULE_VERSION_DATE = TASKS_VERSION_DATE;
		}

		$this->MODULE_NAME = GetMessage("TASKS_MODULE_NAME");
		$this->MODULE_DESCRIPTION = GetMessage("TASKS_MODULE_DESC");
	}


	function InstallDB($arParams = array())
	{
		global $DB, $APPLICATION;
		$this->errors = false;

		// Database tables creation
		if(!$DB->Query("SELECT 'x' FROM b_tasks WHERE 1=0", true))
		{
			$this->errors = $DB->RunSQLBatch($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/db/".mb_strtolower($DB->type)."/install.sql");
		}

		$errors = self::InstallUserFields();
		if ( ! empty($errors) )
		{
			if ( ! is_array($this->errors) )
				$this->errors = array();

			$this->errors = array_merge($this->errors, $errors);
		}

		$APPLICATION->ResetException();
		if($this->errors !== false)
		{
			$APPLICATION->ThrowException(implode("<br>", $this->errors));
			return false;
		}

		RegisterModule("tasks");
		RegisterModuleDependences("search", "OnReindex", "tasks", "CTasks", "OnSearchReindex", 200);
		RegisterModuleDependences("main", "OnUserDelete", "tasks", "CTasks", "OnUserDelete");
		RegisterModuleDependences("im", "OnGetNotifySchema", "tasks", "CTasksNotifySchema", "OnGetNotifySchema");
		RegisterModuleDependences('main', 'OnBeforeUserDelete', 'tasks', 'CTasks', 'OnBeforeUserDelete');
		RegisterModuleDependences("pull", "OnGetDependentModule", "tasks", "CTasksPullSchema", "OnGetDependentModule");
		RegisterModuleDependences(
			'search',
			'BeforeIndex',
			'tasks',
			'CTasksTools',
			'FixForumCommentURL',
			200
		);
		RegisterModuleDependences('intranet', 'OnPlannerInit', 'tasks',
			'CTaskPlannerMaintance', 'OnPlannerInit');
		RegisterModuleDependences('intranet', 'OnPlannerAction', 'tasks',
			'CTaskPlannerMaintance', 'OnPlannerAction');
		RegisterModuleDependences('rest', 'OnRestServiceBuildDescription', 'tasks',
			'CTaskRestService', 'OnRestServiceBuildDescription');
		RegisterModuleDependences('rest', 'onFindMethodDescription', 'tasks',
			'\\Bitrix\\Tasks\\Dispatcher', 'restRegister');

		RegisterModuleDependences('forum', 'OnCommentTopicAdd', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Topic', 'onBeforeAdd');
		RegisterModuleDependences('forum', 'OnAfterCommentTopicAdd', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Topic', 'onAfterAdd');
		RegisterModuleDependences('forum', 'OnBeforeCommentDelete', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Comment', 'onBeforeDelete');
		RegisterModuleDependences('forum', 'OnAfterCommentAdd', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Comment', 'onAfterAdd');
		RegisterModuleDependences('forum', 'OnAfterCommentUpdate', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Comment', 'onAfterUpdate');

		RegisterModuleDependences('forum', 'OnModuleUnInstall', 'tasks', 'CTasksRarelyTools', 'onForumUninstall');
		RegisterModuleDependences('webdav', 'OnModuleUnInstall', 'tasks', 'CTasksRarelyTools', 'onWebdavUninstall');
		RegisterModuleDependences('intranet', 'OnModuleUnInstall', 'tasks', 'CTasksRarelyTools', 'onIntranetUninstall');

		RegisterModuleDependences('timeman', 'OnAfterTMDayStart', 'tasks', 'CTaskPlannerMaintance', 'OnAfterTMDayStart');
		RegisterModuleDependences('timeman', 'OnAfterTMEntryUpdate', 'tasks', 'CTaskTimerManager', 'onAfterTMEntryUpdate');

		RegisterModuleDependences('tasks', 'OnBeforeTaskUpdate', 'tasks', 'CTaskTimerManager', 'onBeforeTaskUpdate');
		RegisterModuleDependences('tasks', 'OnBeforeTaskDelete', 'tasks', 'CTaskTimerManager', 'onBeforeTaskDelete');

		RegisterModuleDependences('socialnetwork', 'OnBeforeSocNetGroupDelete', 'tasks', 'CTasks', 'onBeforeSocNetGroupDelete');
		RegisterModuleDependences('socialnetwork', 'OnSonetLogFavorites', 'tasks', '\\Bitrix\\Tasks\\Integration\\Socialnetwork\\Task', 'OnSonetLogFavorites');

		RegisterModuleDependences("main", "OnAfterRegisterModule", "main", "tasks", "InstallUserFields", 100, "/modules/tasks/install/index.php"); // check webdav UF

		RegisterModuleDependences("main", "OnBeforeUserTypeAdd", "tasks", "CTasksRarelyTools", "onBeforeUserTypeAdd");
		RegisterModuleDependences("main", "OnBeforeUserTypeUpdate", "tasks", "CTasksRarelyTools", "onBeforeUserTypeUpdate");
		RegisterModuleDependences("main", "OnBeforeUserTypeDelete", "tasks", "CTasksRarelyTools", "onBeforeUserTypeDelete");

		// im "ilike"
		RegisterModuleDependences("main", "OnGetRatingContentOwner", "tasks", "CTaskNotifications", "OnGetRatingContentOwner");
		RegisterModuleDependences("im", "OnGetMessageRatingVote", "tasks", "CTaskNotifications", "OnGetMessageRatingVote");

		// im "answer" on comment notification
		RegisterModuleDependences("im", "OnAnswerNotify", "tasks", "CTaskNotifications", "OnAnswerNotify");

		// "mail" module integration
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->registerEventHandler('mail', 'onReplyReceivedTASKS_TASK', 'tasks', '\Bitrix\Tasks\Integration\Mail\Task', 'onReplyReceived');
		$eventManager->registerEventHandler('mail', 'onForwardReceivedTASKS_TASK', 'tasks', '\Bitrix\Tasks\Integration\Mail\Task', 'onForwardReceived');

		$eventManager->registerEventHandler('pull', 'onGetMobileCounter', 'tasks', '\Bitrix\Tasks\Integration\Pull\Counter', 'onGetMobileCounter');
		$eventManager->registerEventHandler('pull', 'onGetMobileCounterTypes', 'tasks', '\Bitrix\Tasks\Integration\Pull\Counter', 'onGetMobileCounterTypes');

		//Recyclebin
		$eventManager->registerEventHandler('recyclebin', 'OnModuleSurvey', 'tasks', '\Bitrix\Tasks\Integration\Recyclebin\Manager', 'OnModuleSurvey');
		$eventManager->registerEventHandler('recyclebin', 'onAdditionalDataRequest', 'tasks', '\Bitrix\Tasks\Integration\Recyclebin\Manager', 'OnAdditionalDataRequest');

		// user field update
		RegisterModuleDependences("main", "OnAfterUserTypeAdd", "tasks", "\\Bitrix\\Tasks\\Util\\UserField", "onAfterUserTypeAdd");
		RegisterModuleDependences("main", "OnAfterUserTypeUpdate", "tasks", "\\Bitrix\\Tasks\\Util\\UserField", "onAfterUserTypeUpdate");
		RegisterModuleDependences("main", "OnAfterUserTypeDelete", "tasks", "\\Bitrix\\Tasks\\Util\\UserField", "onAfterUserTypeDelete");

		// disk entity controllers
		RegisterModuleDependences('disk', 'onBuildAdditionalConnectorList', 'tasks', '\Bitrix\Tasks\Integration\Disk', 'onBuildConnectorList');

		// kanban
		$eventManager->registerEventHandler('main', 'OnUserDelete', 'tasks', '\Bitrix\Tasks\Kanban\StagesTable', 'onUserDelete');
		$eventManager->registerEventHandler('socialnetwork', 'onSocNetGroupDelete', 'tasks', '\Bitrix\Tasks\Kanban\StagesTable', 'onSocNetGroupDelete');

		$eventManager->registerEventHandler('socialnetwork', 'onSocNetGroupDelete', 'tasks', '\Bitrix\Tasks\ProjectsTable', 'onSocNetGroupDelete');
		$eventManager->registerEventHandler('socialnetwork', 'onContentViewed', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\ContentViewHandler', 'onContentViewed');
		$eventManager->registerEventHandler('socialnetwork', 'onContentFinalizeView', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\ContentViewHandler', 'onContentFinalizeView');
		$eventManager->registerEventHandler('socialnetwork', 'onLogIndexGetContent', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\Log', 'onIndexGetContent');
		$eventManager->registerEventHandler('socialnetwork', 'onAfterLogFollowSet', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\Log', 'onAfterLogFollowSet');
		$eventManager->registerEventHandler('socialnetwork', 'OnAfterSocNetLogCommentAdd', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\Log', 'onAfterSocNetLogCommentAdd');

		$this->InstallTasks();

		CModule::includeModule('tasks');
		if ($DB->Query("CREATE FULLTEXT INDEX IXF_TASKS_SEARCH_INDEX_SEARCH_INDEX ON b_tasks_search_index (SEARCH_INDEX)", true))
		{
			\Bitrix\Tasks\Internals\Task\SearchIndexTable::getEntity()->enableFullTextIndex("SEARCH_INDEX");
		}

		(new \Bitrix\Tasks\Access\Install\AccessInstaller($DB))->install();
		(new \Bitrix\Tasks\Access\Install\Migration($DB))->migrateTemplateRights();

		static::addAgents();
		static::runSteppers();
		static::setOptions();

		return true;
	}

	public static function addAgents(): void
	{
		CAgent::AddAgent('\Bitrix\Tasks\Util\AgentManager::sendReminder();','tasks', 'N', 60);
		CAgent::AddAgent('\Bitrix\Tasks\Util\AgentManager::notificationThrottleRelease();','tasks', 'N', 300);

		CTimeZone::Disable();
		CAgent::AddAgent('\Bitrix\Tasks\Internals\Effective::agent();', 'tasks', 'N', 86400, '', 'Y', Bitrix\Main\Type\DateTime::createFromTimestamp(strtotime('23:50:00')));
		CTimeZone::Enable();
	}

	public static function runSteppers(): void
	{
		$map = [
			[
				'class' => \Bitrix\Tasks\Update\EfficiencyRecount::class,
				'delay' => 300,
			],
			[
				'class' => \Bitrix\Tasks\Update\CounterRecount::class,
				'delay' => 300,
			],
			[
				'class' => \Bitrix\Tasks\Update\ExpiredAgentCreator::class,
				'delay' => 300,
			],
		];
		foreach ($map as $stepper)
		{
			/** @var Bitrix\Main\Update\Stepper $class */
			$class = $stepper['class'];
			$delay = $stepper['delay'];

			$class::bind($delay);
		}
	}

	public static function setOptions(): void
	{
		$map = [
			[
				'name' => 'task_comment_allow_edit',
				'value' => 'Y',
			],
			[
				'name' => 'task_comment_allow_remove',
				'value' => 'Y',
			],
			[
				'condition' => COption::GetOptionString('tasks', 'sanitize_level', 'not installed yet ))') === 'not installed yet ))',
				'name' => 'sanitize_level',
				'value' => CBXSanitizer::SECURE_LEVEL_LOW,
			],
			[
				'name' => 'tasksDisableDefaultListGroups',
				'value' => (new \Bitrix\Main\Type\DateTime())->format('Y-m-d H:i:s'),
			],
		];
		foreach ($map as $option)
		{
			if (!isset($option['condition']) || $option['condition'])
			{
				\Bitrix\Main\Config\Option::set('tasks', $option['name'], $option['value']);
			}
		}
	}

	function UnInstallDB($arParams = array())
	{
		global $DB, $APPLICATION;

		$this->errors = false;

		if(!array_key_exists("savedata", $arParams) || $arParams["savedata"] != "Y")
		{
			static::deleteFileField('TASKS_TASK');
			static::deleteFileField('TASKS_TASK_TEMPLATE');
			static::deleteMailField();

			$this->errors = $DB->RunSQLBatch($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/db/".mb_strtolower($DB->type)."/uninstall.sql");
		}

		//delete agents
		CAgent::RemoveModuleAgents("tasks");

		if (CModule::IncludeModule("search"))
		{
			CSearch::DeleteIndex("tasks");
		}

		UnRegisterModule("tasks");
		UnRegisterModuleDependences("search", "OnReindex", "tasks", "CTasks", "OnSearchReindex");
		UnRegisterModuleDependences("main", "OnUserDelete", "tasks", "CTasks", "OnUserDelete");
		UnRegisterModuleDependences("im", "OnGetNotifySchema", "tasks", "CTasksNotifySchema", "OnGetNotifySchema");
		UnRegisterModuleDependences('main', 'OnBeforeUserDelete', 'tasks', 'CTasks', 'OnBeforeUserDelete');
		UnRegisterModuleDependences("pull", "OnGetDependentModule", "tasks", "CTasksPullSchema", "OnGetDependentModule");
		UnRegisterModuleDependences(
			'search',
			'BeforeIndex',
			'tasks',
			'CTasksTools',
			'FixForumCommentURL'
		);
		UnRegisterModuleDependences('intranet', 'OnPlannerInit', 'tasks',
			'CTaskPlannerMaintance', 'OnPlannerInit');
		UnRegisterModuleDependences('intranet', 'OnPlannerAction', 'tasks',
			'CTaskPlannerMaintance', 'OnPlannerAction');
		UnRegisterModuleDependences('rest', 'OnRestServiceBuildDescription', 'tasks',
			'CTaskRestService', 'OnRestServiceBuildDescription');
		UnRegisterModuleDependences('rest', 'onFindMethodDescription', 'tasks',
			'\\Bitrix\\Tasks\\Dispatcher', 'restRegister');

		UnRegisterModuleDependences('forum', 'OnCommentTopicAdd', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Topic', 'onBeforeAdd');
		UnRegisterModuleDependences('forum', 'OnAfterCommentTopicAdd', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Topic', 'onAfterAdd');
		UnRegisterModuleDependences('forum', 'OnBeforeCommentDelete', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Comment', 'onBeforeDelete');
		UnRegisterModuleDependences('forum', 'OnAfterCommentAdd', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Comment', 'onAfterAdd');
		UnRegisterModuleDependences('forum', 'OnAfterCommentUpdate', 'tasks', '\Bitrix\Tasks\Integration\Forum\Task\Comment', 'onAfterUpdate');

		UnRegisterModuleDependences('forum', 'OnModuleUnInstall', 'tasks', 'CTasksRarelyTools', 'onForumUninstall');
		UnRegisterModuleDependences('webdav', 'OnModuleUnInstall', 'tasks', 'CTasksRarelyTools', 'onWebdavUninstall');
		UnRegisterModuleDependences('intranet', 'OnModuleUnInstall', 'tasks', 'CTasksRarelyTools', 'onIntranetUninstall');

		UnRegisterModuleDependences('timeman', 'OnAfterTMDayStart', 'tasks', 'CTaskPlannerMaintance', 'OnAfterTMDayStart');
		UnRegisterModuleDependences('timeman', 'OnAfterTMEntryUpdate', 'tasks', 'CTaskTimerManager', 'onAfterTMEntryUpdate');

		UnRegisterModuleDependences('tasks', 'OnBeforeTaskUpdate', 'tasks', 'CTaskTimerManager', 'onBeforeTaskUpdate');
		UnRegisterModuleDependences('tasks', 'OnBeforeTaskDelete', 'tasks', 'CTaskTimerManager', 'onBeforeTaskDelete');

		UnRegisterModuleDependences('socialnetwork', 'OnBeforeSocNetGroupDelete', 'tasks', 'CTasks', 'onBeforeSocNetGroupDelete');
		UnRegisterModuleDependences('socialnetwork', 'OnSonetLogFavorites', 'tasks', '\\Bitrix\\Tasks\\Integration\\Socialnetwork\\Task', 'OnSonetLogFavorites');
		UnRegisterModuleDependences("main", "OnAfterRegisterModule", "main", "tasks", "InstallUserFields", "/modules/tasks/install/index.php"); // check webdav UF
		UnRegisterModuleDependences("main", "OnBeforeUserTypeAdd", "tasks", "CTasksRarelyTools", "onBeforeUserTypeAdd");
		UnRegisterModuleDependences("main", "OnBeforeUserTypeUpdate", "tasks", "CTasksRarelyTools", "onBeforeUserTypeUpdate");
		UnRegisterModuleDependences("main", "OnBeforeUserTypeDelete", "tasks", "CTasksRarelyTools", "onBeforeUserTypeDelete");

		// im "ilike"
		UnRegisterModuleDependences("main", "OnGetRatingContentOwner", "tasks", "CTaskNotifications", "OnGetRatingContentOwner");
		UnRegisterModuleDependences("im", "OnGetMessageRatingVote", "tasks", "CTaskNotifications", "OnGetMessageRatingVote");

		// im "answer" on comment notification
		UnRegisterModuleDependences("im", "OnAnswerNotify", "tasks", "CTaskNotifications", "OnAnswerNotify");

		// "mail" module integration
		$eventManager = \Bitrix\Main\EventManager::getInstance();
		$eventManager->unRegisterEventHandler('mail', 'onReplyReceivedTASKS_TASK', 'tasks', '\Bitrix\Tasks\Integration\Mail\Task', 'onReplyReceived');
		$eventManager->unRegisterEventHandler('mail', 'onForwardReceivedTASKS_TASK', 'tasks', '\Bitrix\Tasks\Integration\Mail\Task', 'onForwardReceived');

		// user field update
		UnRegisterModuleDependences("main", "OnAfterUserTypeAdd", "tasks", "\\Bitrix\\Tasks\\Util\\UserField", "onAfterUserTypeAdd");
		UnRegisterModuleDependences("main", "OnAfterUserTypeUpdate", "tasks", "\\Bitrix\\Tasks\\Util\\UserField", "onAfterUserTypeUpdate");
		UnRegisterModuleDependences("main", "OnAfterUserTypeDelete", "tasks", "\\Bitrix\\Tasks\\Util\\UserField", "onAfterUserTypeDelete");

		// disk entity controllers
		UnRegisterModuleDependences('disk', 'onBuildAdditionalConnectorList', 'tasks', '\Bitrix\Tasks\Integration\Disk', 'onBuildConnectorList');

		$eventManager->unRegisterEventHandler('socialnetwork', 'onLogIndexGetContent', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\Log', 'onIndexGetContent');
		$eventManager->unRegisterEventHandler('socialnetwork', 'onAfterLogFollowSet', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\Log', 'onAfterLogFollowSet');
		$eventManager->unRegisterEventHandler('socialnetwork', 'OnAfterSocNetLogCommentAdd', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\Log', 'onAfterSocNetLogCommentAdd');

		// kanban
		$eventManager->unRegisterEventHandler('socialnetwork', 'onSocNetGroupDelete', 'tasks', '\Bitrix\Tasks\Kanban\StagesTable', 'onSocNetGroupDelete');
		$eventManager->unRegisterEventHandler('socialnetwork', 'onSocNetGroupDelete', 'tasks', '\Bitrix\Tasks\ProjectsTable', 'onSocNetGroupDelete');
		$eventManager->unRegisterEventHandler('main', 'OnUserDelete', 'tasks', '\Bitrix\Tasks\Kanban\StagesTable', 'onUserDelete');

		$eventManager->unRegisterEventHandler('socialnetwork', 'onContentViewed', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\ContentViewHandler', 'onContentViewed');
		$eventManager->unRegisterEventHandler('socialnetwork', 'onContentFinalizeView', 'tasks', '\Bitrix\Tasks\Integration\Socialnetwork\ContentViewHandler', 'onContentFinalizeView');

		$eventManager->unRegisterEventHandler('pull', 'onGetMobileCounter', 'tasks', '\Bitrix\tasks\Integration\Pull\Counter', 'onGetMobileCounter');
		$eventManager->unRegisterEventHandler('pull', 'onGetMobileCounterTypes', 'tasks', '\Bitrix\tasks\Integration\Pull\Counter', 'onGetMobileCounterTypes');

		//Recyclebin
		$eventManager->unRegisterEventHandler('recyclebin', 'OnModuleSurvey', 'tasks', '\Bitrix\Tasks\Integration\Recyclebin\Manager', 'OnModuleSurvey');
		$eventManager->unRegisterEventHandler('recyclebin', 'onAdditionalDataRequest', 'tasks', '\Bitrix\Tasks\Integration\Recyclebin\Manager', 'onAdditionalDataRequest');

		// remove tasks from socnetlog table
		if (
			(
				!array_key_exists("savedata", $arParams)
				|| $arParams["savedata"] != "Y"
			)
			&& IsModuleInstalled('socialnetwork')
			&& CModule::IncludeModule('socialnetwork')
		)
		{
			$dbRes = CSocNetLog::GetList(
				array(),
				array("EVENT_ID" => "tasks"),
				false,
				false,
				array("ID")
			);

			if ($dbRes)
			{
				while ($arRes = $dbRes->Fetch())
				{
					CSocNetLog::Delete($arRes["ID"]);
				}
			}
		}

		// Remove tasks from IM
		if (IsModuleInstalled('im') && CModule::IncludeModule('im'))
		{
			if (method_exists('CIMNotify', 'DeleteByModule'))
				CIMNotify::DeleteByModule('tasks');
		}

		// remove comment edit flags
		COption::RemoveOption('tasks', 'task_comment_allow_edit','');
		COption::RemoveOption('tasks', 'task_comment_allow_remove', '');

		return true;
	}


	public static function InstallUserFields($moduleId = 'all')
	{
		global $APPLICATION;

		$errors = array();

		if($moduleId === 'all' || $moduleId === 'disk')
		{
			$errors = self::installDiskUserFields();
		}

		if (in_array($moduleId, array('all', 'mail')))
		{
			if (isModuleInstalled('mail'))
			{
				$uf = new \CUserTypeEntity;
				$res = \CUserTypeEntity::getList(
					array(),
					array(
						'ENTITY_ID' => 'TASKS_TASK',
						'FIELD_NAME' => 'UF_MAIL_MESSAGE'
					)
				);
				if (!$res->fetch())
				{
					$id = $uf->add(array(
						'ENTITY_ID'     => 'TASKS_TASK',
						'FIELD_NAME'    => 'UF_MAIL_MESSAGE',
						'USER_TYPE_ID'  => 'mail_message',
						'XML_ID'        => '',
						'MULTIPLE'      => 'N',
						'MANDATORY'     => 'N',
						'SHOW_FILTER'   => 'N',
						'SHOW_IN_LIST'  => 'N',
						'EDIT_IN_LIST'  => 'N',
						'IS_SEARCHABLE' => 'N',
					), false);

					if (!$id && $APPLICATION->getException())
					{
						$errors[] = $APPLICATION->getException()->getString();
					}
				}
			}
		}

		return ($errors);
	}

	public static function installDiskUserFields()
	{
		$errors = array();

		if(!IsModuleInstalled('disk'))
		{
			return $errors;
		}

		static::createFileField('TASKS_TASK', $errors);
		static::createFileField('TASKS_TASK_TEMPLATE', $errors);

		static::createChecklistFileField('TASKS_TASK_CHECKLIST', $errors);
		static::createChecklistFileField('TASKS_TASK_TEMPLATE_CHECKLIST', $errors);

		return $errors;
	}

	private static function createFileField($entity, array &$errors)
	{
		global $APPLICATION;

		$uf = new CUserTypeEntity;
		$rsData = CUserTypeEntity::getList(array("ID" => "ASC"), array("ENTITY_ID" => $entity, "FIELD_NAME" => 'UF_TASK_WEBDAV_FILES'));
		if (!($rsData && ($arRes = $rsData->Fetch())))
		{
			$intID = $uf->add(array(
				'ENTITY_ID'     => $entity,
				'FIELD_NAME'    => 'UF_TASK_WEBDAV_FILES',
				'USER_TYPE_ID'  => 'disk_file',
				'XML_ID'        => 'TASK_WEBDAV_FILES',
				'MULTIPLE'      => 'Y',
				'MANDATORY'     =>  null,
				'SHOW_FILTER'   => 'N',
				'SHOW_IN_LIST'  =>  null,
				'EDIT_IN_LIST'  =>  null,
				'IS_SEARCHABLE' =>  'Y',
				'EDIT_FORM_LABEL' => array(
					'en' => 'Load files',
					'ru' => 'Load files',
					'de' => 'Load files'
				)
			), false);

			if (false == $intID && ($strEx = $APPLICATION->getException()))
			{
				$errors[] = $strEx->getString();
			}
		}
	}

	private static function createChecklistFileField($entity, array &$errors)
	{
		global $APPLICATION;

		$userField = new CUserTypeEntity();
		$userFieldRes = \CUserTypeEntity::getList([], ['ENTITY_ID' => $entity, 'FIELD_NAME' => 'UF_CHECKLIST_FILES']);

		if (!$userFieldRes->Fetch())
		{
			$userFieldId = $userField->Add([
				'ENTITY_ID' => $entity,
				'FIELD_NAME' => 'UF_CHECKLIST_FILES',
				'USER_TYPE_ID' => 'disk_file',
				'MULTIPLE' => 'Y',
				'MANDATORY' => 'N',
				'SHOW_FILTER' => 'N',
				'SHOW_IN_LIST' => 'N',
				'EDIT_IN_LIST' => 'N',
				'IS_SEARCHABLE' => 'N',
			], false);

			if (!$userFieldId && $APPLICATION->getException())
			{
				$errors[] = $APPLICATION->getException()->getString();
			}
		}
	}

	private static function deleteFileField($entity)
	{
		$rsUserType = CUserTypeEntity::getList(
			array(),
			array(
				'ENTITY_ID'  => $entity,
				'FIELD_NAME' => 'UF_TASK_WEBDAV_FILES',
			)
		);

		if ($arUserType = $rsUserType->fetch())
		{
			$obUserField = new CUserTypeEntity;
			$obUserField->delete($arUserType['ID']);
		}
	}

	private static function deleteMailField()
	{
		$userType = \CUserTypeEntity::getList(
			array(),
			array(
				'ENTITY_ID'  => 'TASKS_TASK',
				'FIELD_NAME' => 'UF_MAIL_MESSAGE',
			)
		)->fetch();

		if ($userType)
		{
			$userField = new \CUserTypeEntity;
			$userField->delete($userType['ID']);
		}
	}

	function InstallEvents()
	{
		global $DB;
		$sIn = "'TASK_REMINDER'";
		$rs = $DB->Query("SELECT count(*) C FROM b_event_type WHERE EVENT_NAME IN (".$sIn.") ", false, "File: ".__FILE__."<br>Line: ".__LINE__);
		$ar = $rs->Fetch();
		if($ar["C"] <= 0)
		{
			include($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/events/set_events.php");
		}
		return true;
	}


	function UnInstallEvents()
	{
		global $DB;
		include_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/events/del_events.php");
		return true;
	}


	function InstallFiles($arParams = array())
	{
		global $DB;

		if($_ENV["COMPUTERNAME"]!='BX')
		{
			CopyDirFiles(
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/admin",
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/admin",
				false
			);

			CopyDirFiles(
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/components",
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/components",
				true,
				true
			);

			CopyDirFiles(
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/activities",
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/activities",
				true,
				true
			);

			CopyDirFiles(
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/public/js",
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/js",
				true,
				true
			);

			CopyDirFiles(
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/public/tools",
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/tools",
				true,
				true
			);

			CopyDirFiles(
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/public/services",
				$_SERVER["DOCUMENT_ROOT"]."/bitrix/services",
				true,
				true
			);

			CUrlRewriter::Add(array(
				"CONDITION" => "#^/stssync/tasks/#",
				"RULE" => "",
				"ID" => "bitrix:stssync.server",
				"PATH" => "/bitrix/services/stssync/tasks/index.php",
			));
		}

		return true;
	}


	function UnInstallFiles()
	{
		DeleteDirFiles($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/admin/", $_SERVER["DOCUMENT_ROOT"]."/bitrix/admin");

		DeleteDirFilesEx("/bitrix/js/tasks/");//scripts
		return true;
	}

	function getModuleTasks()
	{
		return array(
			'tasks_task_template_read' => array(
				'BINDING' => 'task_template',
				'OPERATIONS' => array(
					'read'
				),
			),
			'tasks_task_template_full' => array(
				'BINDING' => 'task_template',
				'OPERATIONS' => array(
					'read',
					'update',
					'delete',
				)
			),
		);
	}

	function DoInstall()
	{
		global $DB, $DOCUMENT_ROOT, $APPLICATION;

		if (!CBXFeatures::IsFeatureEditable('Tasks'))
		{
			$this->errors = array(GetMessage('MAIN_FEATURE_ERROR_EDITABLE'));
			$GLOBALS["errors"] = $this->errors;
			$APPLICATION->IncludeAdminFile(
				GetMessage('TASKS_INSTALL_TITLE'),
				$_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/' . $this->MODULE_ID . '/install/step1.php');
		}
		elseif (!IsModuleInstalled("tasks"))
		{
			$this->InstallFiles();
			$this->InstallDB();
			$this->InstallEvents();

			$GLOBALS["errors"] = $this->errors;
			$APPLICATION->IncludeAdminFile(GetMessage("TASKS_INSTALL_TITLE"), $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/step1.php");
		}
	}


	function DoUninstall()
	{
		global $DB, $DOCUMENT_ROOT, $APPLICATION, $step;
		$step = intval($step);
		if($step < 2)
		{
			$APPLICATION->IncludeAdminFile(GetMessage("TASKS_UNINSTALL_TITLE"), $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/unstep1.php");
		}
		elseif($step == 2)
		{
			$GLOBALS["CACHE_MANAGER"]->CleanAll();
			$this->UnInstallDB(array(
				"savedata" => $_REQUEST["savedata"],
			));
			$this->UnInstallFiles();
			$this->UnInstallEvents();
			$GLOBALS["errors"] = $this->errors;
			$APPLICATION->IncludeAdminFile(GetMessage("TASKS_UNINSTALL_TITLE"), $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/tasks/install/unstep2.php");
		}
	}
}