Your IP : 3.142.152.51


Current Path : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/tasks/lib/integration/recyclebin/
Upload File :
Current File : /var/www/axolotl/data/www/yar.axolotls.ru/bitrix/modules/tasks/lib/integration/recyclebin/task.php

<?php
namespace Bitrix\Tasks\Integration\Recyclebin;

use Bitrix\Main\Application;
use Bitrix\Main\Data\Cache;
use Bitrix\Main\Error;
use Bitrix\Main\Loader;
use Bitrix\Main\Localization\Loc;
use Bitrix\Main\NotImplementedException;
use Bitrix\Main\Result;
use Bitrix\Socialnetwork\LogTable;
use Bitrix\Tasks\CheckList\Task\TaskCheckListFacade;
use Bitrix\Tasks\Integration;
use Bitrix\Tasks\Internals\TaskTable;
use Bitrix\Tasks\Internals\Task\SearchIndexTable;
use Bitrix\Tasks\Internals\Task\FavoriteTable;
use Bitrix\Tasks\Internals\Task\SortingTable;
use Bitrix\Tasks\Internals\Task\ViewedTable;
use Bitrix\Tasks\Internals\Task\ParameterTable;
use Bitrix\Tasks\Internals\Helper\Task\Dependence;
use Bitrix\Tasks\Internals\UserOption;
use Bitrix\Tasks\Kanban\StagesTable;
use Bitrix\Tasks\Kanban\TaskStageTable;
use Bitrix\Tasks\Util\Restriction\Bitrix24Restriction\Limit\TaskLimit;
use Bitrix\Tasks\Util\Type\DateTime;
use Bitrix\Tasks\Util\User;

use Bitrix\Recyclebin\Internals\Entity;
use Bitrix\Recyclebin\Internals\Contracts\Recyclebinable;

use \CTasks;

if (Loader::includeModule('recyclebin'))
{
	/**
	 * Class Task
	 * @package Bitrix\Tasks\Integration\Recyclebin
	 */
	class Task implements Recyclebinable
	{
		/**
		 * @param $taskId
		 * @param array $task
		 * @return mixed
		 * @throws \Bitrix\Main\ArgumentException
		 * @throws \Bitrix\Main\ObjectPropertyException
		 * @throws \Bitrix\Main\SystemException
		 */
		public static function OnBeforeTaskDelete($taskId, array $task = [])
		{
			$recyclebin = new Entity($taskId, Manager::TASKS_RECYCLEBIN_ENTITY, Manager::MODULE_ID);
			$recyclebin->setTitle($task['TITLE']);

			$additionalData = self::collectAdditionalData($taskId);
			if ($additionalData)
			{
				foreach ($additionalData as $action => $data)
				{
					$recyclebin->add($action, $data);
				}
			}

			$result = $recyclebin->save();
			$resultData = $result->getData();

			return $resultData['ID'];
		}

		/**
		 * @param $taskId
		 * @return array
		 * @throws \Bitrix\Main\ArgumentException
		 * @throws \Bitrix\Main\ObjectPropertyException
		 * @throws \Bitrix\Main\SystemException
		 */
		private static function collectAdditionalData($taskId)
		{
			$data = [];

			$res = TaskStageTable::getList(['filter' => ['TASK_ID' => $taskId], 'select' => ['STAGE_ID']]);
			while ($row = $res->fetch())
			{
				$data['STAGES'][] = $row;
			}

			$res = \CTaskMembers::GetList([], ['TASK_ID' => $taskId, 'TYPE' => ['O', 'R', 'A', 'U']]);
			while ($row = $res->Fetch())
			{
				$data['MEMBERS'][] = [
					'USER_ID' => $row['USER_ID'],
					'TYPE' => $row['TYPE']
				];
			}

			$res = \CTaskDependence::GetList([], ['TASK_ID' => $taskId]);
			while ($row = $res->Fetch())
			{
				$data['DEPENDENCE_TASK'][] = [
					'DEPENDS_ON_ID' => $row['DEPENDS_ON_ID']
				];
			}

			$res = \CTaskDependence::GetList([], ['DEPENDS_ON_ID' => $taskId]);
			while ($row = $res->Fetch())
			{
				$data['DEPENDENCE_ON'][] = [
					'TASK_ID' => $row['TASK_ID']
				];
			}

			$res = \CTaskReminders::GetList([], ['TASK_ID' => $taskId]);
			while ($row = $res->Fetch())
			{
				$data['REMINDERS'][] = $row;
			}

			$res = \CTaskTemplates::GetList([], ['TASK_ID' => $taskId], [], [], ['ID']);
			while ($row = $res->Fetch())
			{
				$data['TEMPLATES'][] = $row['ID'];
			}

			if (\CModule::IncludeModule('crm'))
			{
				$needActivityFields = [
					'OWNER_ID',
					'OWNER_TYPE_ID',
					'TYPE_ID',
					'PROVIDER_ID',
					'PROVIDER_TYPE_ID',
					'PROVIDER_GROUP_ID',
					'CALENDAR_EVENT_ID',
					'PARENT_ID',
					'THREAD_ID',
					'ASSOCIATED_ENTITY_ID',
					'SUBJECT',
					'CREATED',
					'LAST_UPDATED',
					'START_TIME',
					'END_TIME',
					'DEADLINE',
					'COMPLETED',
					'STATUS',
					'RESPONSIBLE_ID',
					'PRIORITY',
					'NOTIFY_TYPE',
					'NOTIFY_VALUE',
					'DESCRIPTION',
					'DESCRIPTION_TYPE',
					'ORIGINATOR_ID'
				];

				$res = \CCrmActivity::GetList([], [
					'TYPE_ID' => \CCrmActivityType::Task,
					'ASSOCIATED_ENTITY_ID' => $taskId
				]);

				while ($a = $res->Fetch())
				{
					$activity = [];
					foreach ($needActivityFields as $fieldCode)
					{
						$activity[$fieldCode] = $a[$fieldCode];
					}

					$data['ACTIVITIES'][] = $activity;
				}
			}

			return $data;
		}

		/**
		 * @param Entity $entity
		 * @return Result|bool
		 */
		public static function moveFromRecyclebin(Entity $entity)
		{
			$result = new Result();

			$taskId = $entity->getEntityId();
			$taskData = $entity->getData();

			try
			{
				$connection = Application::getConnection();
				$connection->queryExecute('UPDATE ' . TaskTable::getTableName() . ' SET ZOMBIE = \'N\' WHERE ID = ' . $taskId);

				$logFields = [
					"TASK_ID" => $taskId,
					"USER_ID" => User::getId(),
					"CREATED_DATE" => new DateTime(),
					"FIELD" => 'RENEW'
				];

				$log = new \CTaskLog();
				$log->Add($logFields);

				$cache = Cache::createInstance();
				$cache->clean(CTasks::CACHE_TASKS_COUNT, CTasks::CACHE_TASKS_COUNT_DIR_NAME);
			}
			catch (\Exception $e)
			{
				$result->addError(new Error($e->getMessage(), $e->getCode()));
			}

			try
			{
				if ($taskData)
				{
					foreach ($taskData as $value)
					{
						$data = unserialize($value['DATA']);
						$action = $value['ACTION'];

						self::restoreAdditionalData($taskId, $action, $data);
					}
				}

				$task = \CTaskItem::getInstance($taskId, 1);
				$task->update([], [
					'FORCE_RECOUNT_COUNTER' => 'Y',
					'PIN_IN_STAGE' => false
				]);

				Integration\SocialNetwork\Log::showLogByTaskId($taskId);
			}
			catch (\Exception $e)
			{
				$result->addError(new Error($e->getMessage(), $e->getCode()));
			}

			return $result;
		}

		/**
		 * Restores entity from recycle bin
		 *
		 * @param $taskId
		 * @param $action
		 * @param array $data
		 * @return Result
		 */
		private static function restoreAdditionalData($taskId, $action, array $data = [])
		{
			$result = new Result();

			try
			{
				$map = [
					'MEMBERS' => [
						'VALUE' => 'TASK_ID',
						'CLASS' => \CTaskMembers::class
					],
					'DEPENDENCE_TASK' => [
						'VALUE' => 'TASK_ID',
						'CLASS' => \CTaskDependence::class
					],
					'DEPENDENCE_ON' => [
						'VALUE' => 'DEPENDS_ON_ID',
						'CLASS' => \CTaskDependence::class
					],
					'REMINDERS' => [
						'VALUE' => '',
						'CLASS' => \CTaskReminders::class
					]
				];

				switch ($action)
				{
					case 'STAGES':
						foreach ($data as $value)
						{
							if (StagesTable::getById($value['STAGE_ID'])->fetch())
							{
								StagesTable::pinInTheStage($taskId, $value['STAGE_ID']);
							}
							else
							{
								StagesTable::pinInStage($taskId);
							}
						}
						break;

					case 'MEMBERS':
					case 'REMINDERS':
					case 'DEPENDENCE_ON':
					case 'DEPENDENCE_TASK':
						foreach ($data as $value)
						{
							$currentMap = $map[$action];

							if ($currentMap['VALUE'])
							{
								$value[$currentMap['VALUE']] = $taskId;
							}

							$class = new $currentMap['CLASS'];
							$class->Add($value);
						}
						break;

					case 'ACTIVITIES':
						if (\CModule::IncludeModule('crm'))
						{
							foreach ($data as $value)
							{
								\CCrmActivity::Add($value);
							}
						}
						break;

					case 'TEMPLATES':
						$connection = Application::getConnection();

						foreach ($data as $templateId)
						{
							$connection->queryExecute('UPDATE b_tasks_template SET TASK_ID = ' . $taskId . ' WHERE ID = ' . $templateId);
						}

						break;

					case 'PARENT_DEPENDENCIES':
						$parentId = $data['PARENT_ID'];
						$connection = Application::getConnection();

						foreach ($data['SUBTASKS'] as $subTaskId)
						{
							$filter = [
								'ID' => $subTaskId,
								'PARENT_ID' => $parentId
							];

							if (\CTasks::GetList([], $filter, ['ID'])->Fetch())
							{
								$connection->queryExecute('UPDATE b_tasks SET PARENT_ID = ' . $taskId . ' WHERE ID = ' . $subTaskId);
								Dependence::attach($subTaskId, $taskId);
							}
						}

						if ($parentId && \CTasks::GetList([], ['ID' => $parentId], ['ID'])->Fetch())
						{
							Dependence::attach($taskId, $parentId);
						}
						break;
				}
			}
			catch (\Exception $e)
			{
				$result->addError(new Error($e->getMessage(), $e->getCode()));
			}

			return $result;
		}

		/**
		 * Removes entity from recycle bin
		 *
		 * @param Entity $entity
		 * @return Result
		 */
		public static function removeFromRecyclebin(Entity $entity)
		{
			global $USER_FIELD_MANAGER;

			$result = new Result;

			try
			{
				$taskId = $entity->getEntityId();
				$tablesToClear = [
					ViewedTable::class => ['TASK_ID', 'USER_ID'],
					ParameterTable::class => ['ID'],
					SearchIndexTable::class => ['ID']
				];

				\CTaskFiles::DeleteByTaskID($taskId);
				\CTaskTags::DeleteByTaskID($taskId);
				\CTaskReminders::DeleteByTaskID($taskId);
				FavoriteTable::deleteByTaskId($taskId, ['LOW_LEVEL' => true]);
				SortingTable::deleteByTaskId($taskId);
				UserOption::deleteByTaskId($taskId);
				TaskStageTable::clearTask($taskId);
				TaskCheckListFacade::deleteByEntityIdOnLowLevel($taskId);

				foreach ($tablesToClear as $table => $select)
				{
					/** @var \Bitrix\Main\ORM\Query\Result $tableResult */
					$tableResult = $table::getList([
						"select" => $select,
						"filter" => [
							"=TASK_ID" => $taskId,
						],
					]);

					while ($item = $tableResult->fetch())
					{
						$table::delete($item);
					}
				}

				$task = TaskTable::getList([
					'select' => ['FORUM_TOPIC_ID'],
					'filter' => ['ID' => $taskId]
				])->fetch();

				Integration\Forum\Task\Topic::delete($task["FORUM_TOPIC_ID"]);

				$USER_FIELD_MANAGER->Delete('TASKS_TASK', $taskId);

				TaskTable::delete($taskId);
			}
			catch (\Exception $e)
			{
				$result->addError(new Error($e->getMessage(), $e->getCode()));
			}

			Integration\SocialNetwork\Log::deleteLogByTaskId($taskId);

			return $result;
		}

		/**
		 * @param Entity $entity
		 * @return bool|void
		 * @throws NotImplementedException
		 */
		public static function previewFromRecyclebin(Entity $entity)
		{
			throw new NotImplementedException("Coming soon...");
		}

		/**
		 * @return array
		 */
		public static function getNotifyMessages()
		{
			return [
				'NOTIFY'=> [
					'RESTORE' => Loc::getMessage('TASKS_RECYCLEBIN_RESTORE_MESSAGE'),
					'REMOVE' => Loc::getMessage('TASKS_RECYCLEBIN_REMOVE_MESSAGE'),
				],
				'CONFIRM' => [
					'RESTORE' => Loc::getMessage('TASKS_RECYCLEBIN_RESTORE_CONFIRM'),
					'REMOVE' => Loc::getMessage('TASKS_RECYCLEBIN_REMOVE_CONFIRM')
				]
			];
		}

		/**
		 * @return array
		 * @throws \Bitrix\Main\ObjectPropertyException
		 * @throws \Bitrix\Main\SystemException
		 */
		public static function getAdditionalData(): array
		{
			return [
				'LIMIT_DATA' => [
					'RESTORE' => [
						'DISABLE' => TaskLimit::isLimitExceeded(),
						'SLIDER_CODE' => 'limit_tasks_recycle_bin_restore',
					],
				],
			];
		}
	}
}