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;
}