- Модуль: tasks
- Путь к файлу: ~/bitrix/modules/tasks/lib/scrum/service/taskservice.php
- Класс: BitrixTasksScrumServiceTaskService
- Вызов: TaskService::onAfterTaskUpdate
static function onAfterTaskUpdate(int $taskId, array &$fields, array &$previousFields)
{
if (!Loader::includeModule('socialnetwork'))
{
return;
}
$newGroupId = (int) ($fields['GROUP_ID'] ?? null);
$previousGroupId = (int) ($previousFields['GROUP_ID'] ?? null);
$isGroupUpdateAction = ($newGroupId > 0 && $newGroupId !== $previousGroupId);
if ($isGroupUpdateAction)
{
$newGroupIsScrum = false;
$newGroup = Workgroup::getById($newGroupId);
if ($newGroup && $newGroup->isScrumProject())
{
$newGroupIsScrum = true;
}
$previousGroupIsScrum = false;
$previousGroup = Workgroup::getById($previousGroupId);
if ($previousGroup && $previousGroup->isScrumProject())
{
$previousGroupIsScrum = true;
}
if (!$newGroupIsScrum)
{
if ($previousGroupIsScrum)
{
(new CacheService($taskId, CacheService::ITEM_TASKS))->clean();
self::deleteScrumItem($taskId);
}
return;
}
}
$currentGroupId = $newGroupId ?: $previousGroupId;
$groupIsScrum = false;
$group = Workgroup::getById($currentGroupId);
if ($group && $group->isScrumProject())
{
$groupIsScrum = true;
}
if (!$groupIsScrum)
{
return;
}
$newParentId = (int) ($fields['PARENT_ID'] ?? null);
$oldParentId = (int) ($previousFields['PARENT_ID'] ?? null);
if ($isGroupUpdateAction)
{
$itemService = new ItemService();
$scrumItem = $itemService->getItemBySourceId($taskId);
if ($scrumItem->isEmpty())
{
self::createScrumItem($taskId, $fields, $previousFields);
}
else
{
$previousFieldsPart = [];
if ($previousGroupId && $newGroupId && $newGroupId !== $previousGroupId)
{
$previousFieldsPart = ['GROUP_ID' => $newGroupId];
}
if ($oldParentId && $newParentId && $newParentId !== $oldParentId)
{
$previousFieldsPart['PARENT_ID'] = $newParentId;
}
self::updateScrumItem($taskId, array_merge($previousFields, $previousFieldsPart));
}
}
$hasLinks = (isset($fields['DEPENDS_ON']) && is_array($fields['DEPENDS_ON']));
$hasPrevLinks = (isset($previousFields['DEPENDS_ON']) && is_array($previousFields['DEPENDS_ON']));
if ($hasLinks)
{
$taskService = new TaskService(UtilUser::getId());
foreach ($fields['DEPENDS_ON'] as $linkedTaskId)
{
$taskService->updateTaskLinks($linkedTaskId, $taskId);
}
if ($hasPrevLinks)
{
foreach (array_diff($previousFields['DEPENDS_ON'], $fields['DEPENDS_ON']) as $linkedTaskId)
{
$taskDependence = new CTaskDependence();
$taskDependence->delete($linkedTaskId, $taskId);
}
}
}
$isScrumFieldsUpdated = (
(isset($fields['TITLE']) && $fields['TITLE'] !== $previousFields['TITLE'])
|| (
isset($fields['TAGS'])
&& $fields['TAGS'] != $previousFields['TAGS']
)
|| (
isset($fields['RESPONSIBLE_ID'])
&& $fields['RESPONSIBLE_ID'] != $previousFields['RESPONSIBLE_ID']
)
|| (
isset($fields['UF_TASK_WEBDAV_FILES'])
&& (array_filter($fields['UF_TASK_WEBDAV_FILES']) != ($previousFields['UF_TASK_WEBDAV_FILES'] ?? null))
)
);
$isCompleteAction = (
isset($fields['STATUS']) && (int)$fields['STATUS'] === Status::COMPLETED
&& (isset($previousFields['STATUS']) && (int)$previousFields['STATUS'] !== Status::COMPLETED)
);
$isRenewAction = (
(isset($fields['STATUS']) && (int)$fields['STATUS'] === Status::PENDING)
&& (
isset($previousFields['STATUS'])
&& (
(int)$previousFields['STATUS'] === Status::COMPLETED
|| (int)$previousFields['STATUS'] === Status::SUPPOSEDLY_COMPLETED
)
)
);
$isEpicChangeAction = (($fields['EPIC'] ?? null) !== ($previousFields['EPIC'] ?? null));
if ($isEpicChangeAction)
{
$itemService = new ItemService();
$pushService = (Loader::includeModule('pull') ? new PushService() : null);
$scrumItem = $itemService->getItemBySourceId($taskId);
$scrumItem->setEpicId($fields['EPIC']);
$itemService->changeItem($scrumItem, $pushService);
}
$isParentChangeAction = ($newParentId && $newParentId !== $oldParentId);
if ($isParentChangeAction)
{
$itemService = new ItemService();
$pushService = (Loader::includeModule('pull') ? new PushService() : null);
if ($oldParentId)
{
$parentItem = $itemService->getItemBySourceId($oldParentId);
if (!$parentItem->isEmpty())
{
$itemService->changeItem($parentItem, $pushService);
(new CacheService($parentItem->getSourceId(), CacheService::ITEM_TASKS))->clean();
}
}
if ($newParentId)
{
$parentItem = $itemService->getItemBySourceId($newParentId);
if (!$parentItem->isEmpty())
{
$itemService->changeItem($parentItem, $pushService);
(new CacheService($parentItem->getSourceId(), CacheService::ITEM_TASKS))->clean();
}
}
$itemService->changeItem($itemService->getItemBySourceId($taskId), $pushService);
}
if (($isScrumFieldsUpdated || $isCompleteAction || $isRenewAction) && !$isParentChangeAction)
{
$itemService = new ItemService();
$pushService = (Loader::includeModule('pull') ? new PushService() : null);
$itemService->changeItem($itemService->getItemBySourceId($taskId), $pushService);
}
if ($isRenewAction)
{
if ($oldParentId && self::isTaskInActiveSprint($oldParentId, $currentGroupId))
{
if (!self::isTaskInActiveSprint($taskId, $currentGroupId))
{
self::moveTaskToActiveSprint($taskId, $currentGroupId);
}
$itemService = new ItemService();
$item = $itemService->getItemBySourceId($taskId);
$parentItem = $itemService->getItemBySourceId($oldParentId);
if (!$item->isEmpty() && !$parentItem->isEmpty())
{
$entityService = new EntityService();
$parentEntity = $entityService->getEntityById($parentItem->getEntityId());
if ($parentEntity->getGroupId() === $currentGroupId)
{
$kanbanService = new KanbanService();
if ($kanbanService->isTaskInFinishStatus($parentEntity->getId(), $taskId))
{
$kanbanService->addTaskToNewStatus($parentEntity->getId(), $taskId);
}
$parentItem->getInfo()->setVisibilitySubtasks('Y');
$itemService->changeItem($parentItem);
}
}
}
else
{
self::moveTaskToBacklog($taskId, $currentGroupId);
}
}
if ($isCompleteAction)
{
self::moveTaskToFinishStatus($taskId, $currentGroupId);
}
(new CacheService($taskId, CacheService::ITEM_TASKS))->clean();
}