• Модуль: tasks
  • Путь к файлу: ~/bitrix/modules/tasks/lib/integration/im/notification/usecase/taskupdated.php
  • Класс: BitrixTasksIntegrationIMNotificationUseCaseTaskUpdated
  • Вызов: TaskUpdated::getNotification
public function getNotification(Message $message): ?Notification
{
	$metadata = $message->getMetaData();
	$task = $metadata->getTask();
	$userRepository = $metadata->getUserRepository();
	$recepient = $message->getRecepient();

	if ($task === null || $userRepository === null)
	{
		return null;
	}

	// $arChanges contains datetimes IN SERVER TIME, NOT CLIENT
	$arChanges = $metadata->getChanges();
	if (empty($arChanges))
	{
		return null;
	}

	$trackedFields = $metadata->getParams()['tracked_fields'] ?? [];
	$nameTemplate = $metadata->getParams()['user_params']['NAME_TEMPLATE'] ?? null;
	$description = '';

	foreach ($arChanges as $key => $value)
	{
		if ($key === 'DESCRIPTION')
		{
			$description .= Loc::getMessage('TASKS_MESSAGE_DESCRIPTION_UPDATED', null, $recepient->getLang());
			$description .= "rn";
			continue;
		}

		if ($key === 'ACCOMPLICES' || $key === 'AUDITORS')
		{
			$fromUsers = explode(',', $value['FROM_VALUE']);
			$toUsers = explode(',', $value['TO_VALUE']);

			$addedUsers = $this->getUniqueExcludedUsers($toUsers, $fromUsers);
			$commaseparatedUsers = $this->getCommaSeparatedUserNames($userRepository, $addedUsers, $nameTemplate);
			if ($commaseparatedUsers)
			{
				$description .= Loc::getMessage("TASKS_MESSAGE_{$key}_ADDED", null, $recepient->getLang());
				$description .= $commaseparatedUsers . "rn";
			}

			$removedUsers = $this->getUniqueExcludedUsers($fromUsers, $toUsers);
			$commaseparatedUsers = $this->getCommaSeparatedUserNames($userRepository, $removedUsers, $nameTemplate);
			if ($commaseparatedUsers)
			{
				$description .= Loc::getMessage("TASKS_MESSAGE_{$key}_REMOVED", null, $recepient->getLang());
				$description .= $commaseparatedUsers . "rn";
			}
			continue;
		}

		$actionMessage = Loc::getMessage('TASKS_MESSAGE_' . $key, null, $recepient->getLang());
		if($actionMessage == '' && isset($trackedFields[$key]) && ($trackedFields[$key]['TITLE'] ?? null) != '')
		{
			$actionMessage = $trackedFields[$key]['TITLE'];
		}

		if(!empty($actionMessage))
		{
			// here we can display value changed for some fields
			$changeMessage = $actionMessage;
			$tmpStr = '';
			switch($key)
			{
				case 'TIME_ESTIMATE':
					$tmpStr .= $this->formatTimeHHMM($value['FROM_VALUE'], $recepient, true)
						.' -> '
						.$this->formatTimeHHMM($value['TO_VALUE'], $recepient, true);
					break;

				case 'TITLE':
					$tmpStr .= $value['FROM_VALUE'].' -> '.$value['TO_VALUE'];
					break;

				case 'RESPONSIBLE_ID':
					$tmpStr .= $this->getCommaSeparatedUserNames($userRepository, [$value['FROM_VALUE']], $nameTemplate)
						. ' -> '
						.$this->getCommaSeparatedUserNames($userRepository, [$value['TO_VALUE']], $nameTemplate)
					;
					break;

				case 'DEADLINE':
				case 'START_DATE_PLAN':
				case 'END_DATE_PLAN':
					$recepientTimeZoneOffset = $userRepository->getUserTimeZoneOffset($recepient->getId());
					// $arChanges ALREADY contains server time, no need to substract user timezone again
					$utsFromValue = $value['FROM_VALUE'];// - $curUserTzOffset;
					$utsToValue = $value['TO_VALUE'];// - $curUserTzOffset;
					// Make bitrix timestamp for given user
					$bitrixTsFromValue = $utsFromValue + $recepientTimeZoneOffset;
					$bitrixTsToValue = $utsToValue + $recepientTimeZoneOffset;

					$timeDescription = '';
					if($utsFromValue > 360000) // is correct timestamp?
					{
						$fromValueAsString = BitrixTasksUI::formatDateTime(
							$bitrixTsFromValue, '^'.BitrixTasksUI::getDateTimeFormat()
						);
						$timeDescription .= $fromValueAsString;
					}

					$timeDescription .= ' --> ';

					if($utsToValue > 360000) // is correct timestamp?
					{
						$toValueAsString = BitrixTasksUI::formatDateTime(
							$bitrixTsToValue, '^'.BitrixTasksUI::getDateTimeFormat()
						);
						$timeDescription .= $toValueAsString;
					}

					$tmpStr .= $timeDescription;
					break;

				case 'TAGS':
					$tmpStr .= ($value['FROM_VALUE']? str_replace(",", ", ", $value["FROM_VALUE"])." -> " : "")
						.($value["TO_VALUE"]? str_replace(",", ", ", $value["TO_VALUE"]) : Loc::getMessage("TASKS_MESSAGE_NO_VALUE", null, $recepient->getLang()));
					break;

				case 'PRIORITY':
					$tmpStr .= Loc::getMessage(
						'TASKS_PRIORITY_' . $value['FROM_VALUE'],
						null,
						$recepient->getLang()) . ' -> ' . Loc::getMessage('TASKS_PRIORITY_' . $value['TO_VALUE'], null, $recepient->getLang());
					break;

				case 'GROUP_ID':
					$fromGroupId = (int)$value['FROM_VALUE'];
					$toGroupId = (int)$value['TO_VALUE'];

					if($fromGroupId && $this->checkUserCanViewGroup($recepient->getId(), $fromGroupId))
					{
						$arGroupFrom = $this->getSocNetGroup($fromGroupId);
						{
							if(isset($arGroupFrom['NAME']))
							{
								$tmpStr .= $arGroupFrom['NAME'] . ' -> ';
							}
						}
					}
					if($toGroupId && $this->checkUserCanViewGroup($recepient->getId(), $toGroupId))
					{
						$arGroupTo = $this->getSocNetGroup($toGroupId);
						{
							if(isset($arGroupTo['NAME']))
							{
								$tmpStr .= $arGroupTo['NAME'];
							}
						}
					}
					else
					{
						$tmpStr .= Loc::getMessage('TASKS_MESSAGE_NO_VALUE', null, $recepient->getLang());
					}

					break;

				case 'PARENT_ID':
					if($value['FROM_VALUE'])
					{
						$fromTaskId = (int)$value['FROM_VALUE'];
						$rsTaskFrom = TaskRegistry::getInstance()->get($fromTaskId);
						{
							if(isset($rsTaskFrom['TITLE']))
							{
								$tmpStr .= BitrixMainTextEmoji::decode($rsTaskFrom['TITLE']) . ' -> ';
							}
						}
					}
					if($value['TO_VALUE'])
					{
						$toTaskId = (int)$value['TO_VALUE'];
						$rsTaskTo = TaskRegistry::getInstance()->get($toTaskId);
						{
							if(isset($rsTaskTo['TITLE']))
							{
								$tmpStr .= BitrixMainTextEmoji::decode($rsTaskTo['TITLE']);
							}
						}
					}
					else
					{
						$tmpStr .= Loc::getMessage('TASKS_MESSAGE_NO_VALUE', null, $recepient->getLang());
					}
					break;

				case 'DEPENDS_ON':
					$arTasksFromStr = array();
					if($value['FROM_VALUE'])
					{
						$fromTaskId = (int)$value['FROM_VALUE'];
						$rsTaskFrom = TaskRegistry::getInstance()->get($fromTaskId);
						if (isset($rsTaskFrom['TITLE']))
						{
							$arTasksFromStr[] = BitrixMainTextEmoji::decode($rsTaskFrom['TITLE']);
						}
					}
					$arTasksToStr = array();
					if($value['TO_VALUE'])
					{
						$toTaskId = (int)$value['TO_VALUE'];
						$rsTaskTo = TaskRegistry::getInstance()->get($toTaskId);
						if (isset($rsTaskTo['TITLE']))
						{
							$arTasksToStr[] = BitrixMainTextEmoji::decode($rsTaskTo['TITLE']);
						}
					}
					$tmpStr .= ($arTasksFromStr? implode(", ", $arTasksFromStr)." -> " : "").($arTasksToStr? implode(", ", $arTasksToStr) : Loc::getMessage("TASKS_MESSAGE_NO_VALUE", null, $recepient->getLang()));
					break;

				case 'MARK':
					$tmpStr .= (!$value['FROM_VALUE']? Loc::getMessage('TASKS_MARK_NONE', null, $recepient->getLang()) : Loc::getMessage("TASKS_MARK_".$value["FROM_VALUE"], null, $recepient->getLang()))." -> ".(!$value["TO_VALUE"]? Loc::getMessage("TASKS_MARK_NONE", null, $recepient->getLang()) : Loc::getMessage("TASKS_MARK_".$value["TO_VALUE"], null, $recepient->getLang()));
					break;

				case 'ADD_IN_REPORT':
					$tmpStr .= ($value['FROM_VALUE'] == 'Y'? Loc::getMessage("TASKS_MESSAGE_IN_REPORT_YES", null, $recepient->getLang()) : Loc::getMessage("TASKS_MESSAGE_IN_REPORT_NO", null, $recepient->getLang()))." -> ".($value["TO_VALUE"] == "Y"? Loc::getMessage("TASKS_MESSAGE_IN_REPORT_YES", null, $recepient->getLang()) : Loc::getMessage("TASKS_MESSAGE_IN_REPORT_NO", null, $recepient->getLang()));
					break;

				case 'DELETED_FILES':
					$tmpStr .= $value['FROM_VALUE'];
					$tmpStr .= $value['TO_VALUE'];
					break;

				case 'NEW_FILES':
					$tmpStr .= $value['TO_VALUE'];
					break;
			}
			if ($tmpStr !== '')
			{
				$changeMessage .= ': ' . trim($tmpStr);
			}

			$description .= $changeMessage;
			$description .= "rn";
		}
	}

	if ($description === '') // not supported case
	{
		return null;
	}

	$locKey = 'TASKS_TASK_CHANGED_MESSAGE';
	$notification = new Notification(
		$locKey,
		$message
	);

	$assignedTo = $metadata->getParams()['assigned_to'] ?? null;
	if ($assignedTo && $recepient->getId() === $assignedTo)
	{
		$notification->setParams([
			'NOTIFY_EVENT' => 'task_assigned',
		]);
	}

	$title = new NotificationTaskTitle($task);
	$notification->addTemplate(new NotificationTemplate('#TASK_TITLE#', $title->getFormatted($recepient->getLang())));
	$notification->addTemplate(new NotificationTemplate('#TASK_EXTRA#', $description));

	return $notification;
}