• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/activity/provider/task.php
  • Класс: Bitrix\Crm\Activity\Provider\Task
  • Вызов: Task::setFromTask
static function setFromTask($taskId, &$taskFields, &$activity)
{
	$isNew = !(isset($activity['ID']) && intval($activity['ID']) > 0);
	if($isNew)
	{
		$activity['TYPE_ID'] =  \CCrmActivityType::Task;
		$activity['ASSOCIATED_ENTITY_ID'] = $taskId;
		$activity['NOTIFY_TYPE'] = \CCrmActivityNotifyType::None;
		$activity['RESPONSIBLE_ID'] = 0;
		$activity['SUBJECT'] = '';

		if(isset($taskFields['CREATED_BY']))
		{
			$activity['AUTHOR_ID'] = intval($taskFields['CREATED_BY']);
		}
	}

	if(isset($taskFields['CHANGED_BY']))
	{
		$activity['EDITOR_ID'] = intval($taskFields['CHANGED_BY']);
	}

	if(isset($taskFields['RESPONSIBLE_ID']))
	{
		$activity['RESPONSIBLE_ID'] = intval($taskFields['RESPONSIBLE_ID']);
	}

	if(isset($taskFields['TITLE']))
	{
		$activity['SUBJECT'] = $taskFields['TITLE'];
	}

	if($isNew || isset($taskFields['PRIORITY']))
	{
		// Try to convert 'task priority' to 'crm activity priority'
		$priorityText = isset($taskFields['PRIORITY']) ? strval($taskFields['PRIORITY']) : '0';
		$priority = \CCrmActivityPriority::Low;
		if($priorityText === '1')
		{
			$priority = \CCrmActivityPriority::Medium;
		}
		elseif($priorityText === '2')
		{
			$priority = \CCrmActivityPriority::High;
		}

		$activity['PRIORITY'] = $priority;
	}

	if($isNew || isset($taskFields['STATUS']))
	{
		// Try to find status
		$completed = 'N';
		if(isset($taskFields['STATUS']))
		{
			$status = intval($taskFields['STATUS']);
			// COMPLETED: 5, DECLINED: 7
			if($status === 5 || $status === 7)
			{
				$completed = 'Y';
			}
		}
		$activity['COMPLETED'] = $completed;
		$activity['STATUS'] = $completed === 'Y' ? \CCrmActivityStatus::Completed : \CCrmActivityStatus::Waiting;
	}

	$start = null;
	$end = null;

	if(isset($taskFields['DATE_START']))
	{
		// Try to find start date
		if(!empty($taskFields['DATE_START']))
		{
			$start = $taskFields['DATE_START'];
		}
	}

	$isCompleted = isset($activity['COMPLETED']) && $activity['COMPLETED'] === 'Y';
	if(isset($taskFields['DEADLINE']) || isset($taskFields['CLOSED_DATE']))
	{
		if(Crm\Settings\ActivitySettings::getCurrent()->isDeadlineSyncEnabled())
		{
			if(!$isCompleted && !empty($taskFields['DEADLINE']))
			{
				$end = $taskFields['DEADLINE'];
			}
			elseif($isCompleted && !empty($taskFields['CLOSED_DATE']))
			{
				$end = $taskFields['CLOSED_DATE'];
			}
		}
		elseif(!empty($taskFields['DEADLINE']))
		{
			$end = $taskFields['DEADLINE'];
		}
	}

	$activity['START_TIME'] = $start !== null ? $start : '';
	$activity['END_TIME'] = $end !== null ? $end : '';
	if($activity['START_TIME'] === '' && $activity['END_TIME'] !== '')
	{
		$activity['START_TIME'] = $activity['END_TIME'];
	}
	elseif($isCompleted && $activity['END_TIME'] === '' && $activity['START_TIME'] !== '')
	{
		$activity['END_TIME'] = $activity['START_TIME'];
	}
	/*
	elseif(!$isCompleted && $activity['END_TIME'] === '')
	{
		$fields['~DEADLINE'] = \CCrmDateTimeHelper::GetMaxDatabaseDate();
	}
	*/

	if($isNew || isset($taskFields['DESCRIPTION']))
	{
		$description = isset($taskFields['DESCRIPTION']) ? $taskFields['DESCRIPTION'] : '';
		$descriptionType =
			isset($taskFields['DESCRIPTION_IN_BBCODE']) && $taskFields['DESCRIPTION_IN_BBCODE'] === 'Y'
				? \CCrmContentType::BBCode
				: \CCrmContentType::Html;

		if($description !== '' && $descriptionType === \CCrmContentType::Html)
		{
			$sanitizer = new \CBXSanitizer();
			$sanitizer->applyDoubleEncode(false);
			$sanitizer->setLevel(\CBXSanitizer::SECURE_LEVEL_MIDDLE);
			$description = $sanitizer->sanitizeHtml($description);
		}

		if($description === '')
		{
			//Ignore content type if description is empty
			$descriptionType = \CCrmContentType::PlainText;
		}

		$activity['DESCRIPTION'] = $description;
		$activity['DESCRIPTION_TYPE'] = $descriptionType;
	}

	$taskOwners =  isset($taskFields['UF_CRM_TASK']) ? $taskFields['UF_CRM_TASK'] : array();
	$ownerData = array();

	if(!is_array($taskOwners))
	{
		$taskOwners  = array($taskOwners);
	}

	$activity['BINDINGS'] = array();
	if(\CCrmActivity::tryResolveUserFieldOwners($taskOwners, $ownerData, \CCrmUserType::getTaskBindingField()))
	{
		$bindingMap = array();
		foreach($ownerData as $ownerInfo)
		{
			$ownerTypeId = \CCrmOwnerType::resolveID($ownerInfo['OWNER_TYPE_NAME']);
			$ownerId = (int)$ownerInfo['OWNER_ID'];

			$bindingMap["{$ownerTypeId}_{$ownerId}"] = array(
				'OWNER_TYPE_ID' => $ownerTypeId,
				'OWNER_ID' => $ownerId
			);
			$bindingMap = array_merge(
				$bindingMap,
				\CCrmActivity::getSubsidiaryEntityBindingMap($ownerTypeId, $ownerId)
			);
		}
		$bindings = array_values($bindingMap);
		if(count($bindings) > 1)
		{
			//Lead and Deals will be at beginning of list for take activity ownership
			usort(
				$bindings,
				function($a, $b)
				{
					if($a['OWNER_TYPE_ID'] == $b['OWNER_TYPE_ID'])
					{
						return 0;
					}
					return $a['OWNER_TYPE_ID'] > $b['OWNER_TYPE_ID'] ? 1 : -1;
				}
			);
		}
		$activity['BINDINGS'] = $bindings;

	}

	if(!empty($activity['BINDINGS']))
	{
		//Check for owner change
		$ownerTypeId = isset($activity['OWNER_TYPE_ID']) ? (int)$activity['OWNER_TYPE_ID'] : \CCrmOwnerType::Undefined;
		$ownerId = isset($activity['OWNER_ID']) ? (int)$activity['OWNER_ID'] : 0;
		$ownerIsFound = false;
		foreach($activity['BINDINGS'] as $binding)
		{
			if($binding['OWNER_TYPE_ID'] === $ownerTypeId && $binding['OWNER_ID'] === $ownerId)
			{
				$ownerIsFound = true;
				break;
			}
		}

		if(!$ownerIsFound)
		{
			$binding = $activity['BINDINGS'][0];
			$activity['OWNER_TYPE_ID'] = $binding['OWNER_TYPE_ID'];
			$activity['OWNER_ID'] = $binding['OWNER_ID'];
		}


	}
}