• Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/lib/Service/Timeline/Item/Factory/HistoryItem.php
  • Класс: Bitrix\Crm\Service\Timeline\Item\Factory\HistoryItem
  • Вызов: HistoryItem::createItem
static function createItem(Context $context, array $rawData): Item
{
	$assocEntityTypeId = (int)($rawData['ASSOCIATED_ENTITY_TYPE_ID'] ?? 0);
	$typeId = (int)($rawData['TYPE_ID'] ?? 0);
	$typeCategoryId = (int)($rawData['TYPE_CATEGORY_ID'] ?? LogMessageType::UNDEFINED);

	$model = Model::createFromArray($rawData);
	$model->setIsFixed($rawData['IS_FIXED'] === 'Y');

	if ($typeId === TimelineType::ACTIVITY && $assocEntityTypeId === CCrmOwnerType::Activity)
	{
		$responsibleId = (int)($rawData['ASSOCIATED_ENTITY']['RESPONSIBLE_ID'] ?? 0);
		if ($responsibleId > 0)
		{
			$model->setAuthorId($responsibleId);
		}

		$activityTypeId = (int)($rawData['ASSOCIATED_ENTITY']['TYPE_ID'] ?? 0);
		$activityProviderId = (string)($rawData['ASSOCIATED_ENTITY']['PROVIDER_ID'] ?? '');

		$item = Container::getInstance()->getTimelineActivityItemFactory()::create($activityTypeId, $activityProviderId, $context, $model);
		if ($item)
		{
			return $item;
		}
	}

	if ($typeId === TimelineType::CREATION)
	{
		if ($assocEntityTypeId === \CCrmOwnerType::Deal)
		{
			if (!empty($model->getAssociatedEntityModel()->get('ORDER')))
			{
				return new Item\LogMessage\DealCreationByOrder($context, $model);
			}
		}
		elseif ($assocEntityTypeId === \CCrmOwnerType::OrderPayment)
		{
			return new Item\LogMessage\PaymentCreation($context, $model);
		}
		elseif ($assocEntityTypeId === \CCrmOwnerType::OrderShipment)
		{
			return new Item\LogMessage\ShipmentCreation($context, $model);
		}

		return new Item\LogMessage\Creation($context, $model);
	}

	if ($typeId === TimelineType::MODIFICATION)
	{
		return new Item\LogMessage\Modification($context, $model);
	}

	if ($typeId === TimelineType::LINK)
	{
		return new Item\LogMessage\Binding\Link($context, $model);
	}

	if ($typeId === TimelineType::UNLINK)
	{
		return new Item\LogMessage\Binding\Unlink($context, $model);
	}

	if ($typeId === TimelineType::CONVERSION)
	{
		return new Item\LogMessage\Conversion($context, $model);
	}

	if ($typeId === TimelineType::COMMENT)
	{
		return new Item\Comment($context, $model);
	}

	if ($typeId === TimelineType::SIGN_DOCUMENT && Item\SignDocument::isActive())
	{
		return new Item\SignDocument($context, $model);
	}

	if ($typeId === TimelineType::SIGN_DOCUMENT_LOG && Item\LogMessage\SignDocument::isActive())
	{
		return new Item\LogMessage\SignDocument($context, $model);
	}

	if ($typeId === TimelineType::LOG_MESSAGE)
	{
		switch ($typeCategoryId)
		{
			case LogMessageType::CALL_INCOMING:
				return new Item\LogMessage\CallIncoming($context, $model);
			case LogMessageType::OPEN_LINE_INCOMING:
				return new Item\LogMessage\OpenLineIncoming($context, $model);
			case LogMessageType::TODO_CREATED:
				return new Item\LogMessage\TodoCreated($context, $model);
			case LogMessageType::PING:
				$associatedActivityProvider = $rawData['ASSOCIATED_ENTITY']['PROVIDER_ID'] ?? '';
				if ($associatedActivityProvider === \Bitrix\Crm\Activity\Provider\CalendarSharing::getId())
				{
					return new Item\LogMessage\CalendarSharing\CalendarSharingPing($context, $model);
				}
				if ($associatedActivityProvider === \Bitrix\Crm\Activity\Provider\Tasks\Task::getId())
				{
					return new Item\LogMessage\Tasks\TaskPing($context, $model);
				}
				return new Item\LogMessage\Ping($context, $model);
			case LogMessageType::REST:
				return new Item\LogMessage\Rest($context, $model);
			case LogMessageType::SMS_STATUS:
				return new Item\LogMessage\SmsStatus($context, $model);
			case LogMessageType::CALENDAR_SHARING_NOT_VIEWED:
				return new Item\LogMessage\CalendarSharing\NotViewed($context, $model);
			case LogMessageType::CALENDAR_SHARING_VIEWED:
				return new Item\LogMessage\CalendarSharing\Viewed($context, $model);
			case LogMessageType::CALENDAR_SHARING_EVENT_CREATED:
				return new Item\LogMessage\CalendarSharing\EventCreated($context, $model);
			case LogMessageType::CALENDAR_SHARING_EVENT_DOWNLOADED:
				return new Item\LogMessage\CalendarSharing\EventDownloaded($context, $model);
			case LogMessageType::CALENDAR_SHARING_EVENT_CONFIRMED:
				return new Item\LogMessage\CalendarSharing\EventConfirmed($context, $model);
			case LogMessageType::CALENDAR_SHARING_LINK_COPIED:
				return new Item\LogMessage\CalendarSharing\LinkCopied($context, $model);
			case LogMessageType::EMAIL_ACTIVITY_STATUS_SUCCESSFULLY_DELIVERED:
				return new Item\LogMessage\EmailActivityStatuses\SuccessfullyDelivered($context, $model);
		}
	}

	if ($typeId === TimelineType::PRODUCT_COMPILATION)
	{
		switch ($typeCategoryId)
		{
			case ProductCompilationType::PRODUCT_LIST:
				return new Item\ProductCompilationSentToCustomer($context, $model);
			case ProductCompilationType::ORDER_EXISTS:
				return new Item\LogMessage\ProductCompilationOrderExists($context, $model);
			case ProductCompilationType::COMPILATION_VIEWED:
				return new Item\LogMessage\ProductCompilationViewed($context, $model);
			case ProductCompilationType::COMPILATION_NOT_VIEWED:
				return new Item\LogMessage\ProductCompilationNotViewed($context, $model);
			case ProductCompilationType::NEW_DEAL_CREATED:
				return new Item\LogMessage\ProductCompilationNewDealCreated($context, $model);
		}
	}

	if ($typeId === TimelineType::DOCUMENT && Crm::isUniversalActivityScenarioEnabled())
	{
		if ($typeCategoryId === TimelineType::MODIFICATION && Item\LogMessage\DocumentViewed::isActive())
		{
			return new Item\LogMessage\DocumentViewed($context, $model);
		}

		if (Item\Document::isActive())
		{
			return new Item\Document($context, $model);
		}

		return new Item\NotAvailable($context, $model);
	}

	if ($typeId === TimelineType::MARK && $assocEntityTypeId === CCrmOwnerType::Order)
	{
		return new Item\LogMessage\OrderSynchronization($context, $model);
	}

	if ($typeId === TimelineType::ORDER)
	{
		$historyItemFields = $model->getHistoryItemModel()->get('FIELDS');
		$historyItemFields = $historyItemFields ?? [];

		if ($typeCategoryId === TimelineType::CREATION)
		{
			if ($assocEntityTypeId === CCrmOwnerType::Order)
			{
				return new Item\LogMessage\OrderCreation($context, $model);
			}
		}
		elseif ($typeCategoryId === TimelineType::MODIFICATION)
		{
			if ($assocEntityTypeId === CCrmOwnerType::OrderPayment)
			{
				if (
					isset($historyItemFields['PAY_SYSTEM_CLICK'])
					&& $historyItemFields['PAY_SYSTEM_CLICK'] === 'Y'
				)
				{
					return new Item\LogMessage\CustomerSelectedPaymentMethod($context, $model);
				}

				if (
					isset($historyItemFields['NEED_MANUAL_ADD_CHECK'])
					&& $historyItemFields['NEED_MANUAL_ADD_CHECK'] === 'Y'
				)
				{
					return new Item\LogMessage\CheckManualCreation($context, $model);
				}

				if (isset($historyItemFields['VIEWED']))
				{
					if ($historyItemFields['VIEWED'] === 'Y')
					{
						return new Item\LogMessage\PaymentViewed($context, $model);
					}

					return new Item\LogMessage\PaymentNotViewed($context, $model);
				}

				if (
					isset($historyItemFields['STATUS_CODE'])
					&& $historyItemFields['STATUS_CODE'] === 'ERROR'
				)
				{
					return new Item\LogMessage\PaymentError($context, $model);
				}

				if (isset($historyItemFields['SENT']) &&  $historyItemFields['SENT'] === 'Y')
				{
					/**
					 * New blocks of this type are not created anymore
					 */
					return new Item\LogMessage\PaymentSent($context, $model);
				}

				if (isset($historyItemFields['ORDER_PAID']))
				{
					if ($historyItemFields['ORDER_PAID'] === 'Y')
					{
						return new Item\LogMessage\PaymentPaid($context, $model);
					}

					return new Item\LogMessage\PaymentNotPaid($context, $model);
				}
			}
			elseif ($assocEntityTypeId === CCrmOwnerType::OrderShipment)
			{
				if (isset($historyItemFields['ORDER_DEDUCTED']))
				{
					if ($historyItemFields['ORDER_DEDUCTED'] === 'Y')
					{
						return new Item\LogMessage\ShipmentDeducted($context, $model);
					}

					return new Item\LogMessage\ShipmentNotDeducted($context, $model);
				}
			}
			elseif ($assocEntityTypeId === CCrmOwnerType::Order)
			{
				if (
					isset($historyItemFields['MANUAL_CONTINUE_PAY'])
					&& $historyItemFields['MANUAL_CONTINUE_PAY'] === 'Y'
				)
				{
					return new Item\LogMessage\CustomerProceededWithOrder($context, $model);
				}

				if (isset($historyItemFields['ORDER_PAID']))
				{
					if ($historyItemFields['ORDER_PAID'] === 'Y')
					{
						return new Item\LogMessage\OrderPaid($context, $model);
					}

					return new Item\LogMessage\OrderNotPaid($context, $model);
				}

				if (isset($historyItemFields['ORDER_DEDUCTED']))
				{
					if ($historyItemFields['ORDER_DEDUCTED'] === 'Y')
					{
						return new Item\LogMessage\OrderDeducted($context, $model);
					}

					return new Item\LogMessage\OrderNotDeducted($context, $model);
				}
			}
		}
		elseif ($typeCategoryId === OrderCategoryType::ENCOURAGE_BUY_PRODUCTS)
		{
			return new Item\EncourageBuyProducts($context, $model);
		}
	}

	if (in_array($typeId, [TimelineType::FINAL_SUMMARY, TimelineType::FINAL_SUMMARY_DOCUMENTS], true))
	{
		if ($typeCategoryId === TimelineType::CREATION)
		{
			return new Item\FinalSummary($context, $model);
		}
	}

	if ($typeId === TimelineType::ORDER_CHECK)
	{
		if ($typeCategoryId === TimelineType::MARK)
		{
			return new Item\LogMessage\OrderCheckSent($context, $model);
		}

		if ($model->getAssociatedEntityId())
		{
			if ($model->getHistoryItemModel()->get('PRINTED') === 'Y')
			{
				return new Item\OrderCheckPrinted($context, $model);
			}

			return new Item\OrderCheckNotPrinted($context, $model);
		}

		return new Item\LogMessage\OrderCheckCreationError($context, $model);
	}

	if ($typeId === TimelineType::STORE_DOCUMENT)
	{
		$item = HistoryItemStoreDocument::createItem($context, $model);
		if ($item)
		{
			return $item;
		}
	}

	if ($typeId === TimelineType::DELIVERY)
	{
		switch ($typeCategoryId)
		{
			// v3 delivery blocks
			case DeliveryCategoryType::UNIVERSAL:
			// v2 delivery blocks that are compatible with v3 version
			case DeliveryCategoryType::MESSAGE:
			case DeliveryCategoryType::DELIVERY_CALCULATION:
				return new Item\LogMessage\Delivery\Universal($context, $model);
			// v1 taxi blocks that are not compatible with v1 version
			case DeliveryCategoryType::TAXI_ESTIMATION_REQUEST:
				return new Item\LogMessage\Delivery\Taxi\EstimationRequest($context, $model);
			case DeliveryCategoryType::TAXI_CALL_REQUEST:
				return new Item\LogMessage\Delivery\Taxi\CallRequest($context, $model);
			case DeliveryCategoryType::TAXI_CANCELLED_BY_MANAGER:
				return new Item\LogMessage\Delivery\Taxi\CancelledByManager($context, $model);
			case DeliveryCategoryType::TAXI_CANCELLED_BY_DRIVER:
				return new Item\LogMessage\Delivery\Taxi\CancelledByDriver($context, $model);
			case DeliveryCategoryType::TAXI_PERFORMER_NOT_FOUND:
				return new Item\LogMessage\Delivery\Taxi\PerformerNotFound($context, $model);
			case DeliveryCategoryType::TAXI_SMS_PROVIDER_ISSUE:
				return new Item\LogMessage\Delivery\Taxi\SmsProviderIssue($context, $model);
			case DeliveryCategoryType::TAXI_RETURNED_FINISH:
				return new Item\LogMessage\Delivery\Taxi\ReturnedFinish($context, $model);
			// endregion
		}
	}

	if ($typeId === TimelineType::CALENDAR_SHARING)
	{
		switch ($typeCategoryId)
		{
			case CalendarSharing\Entry::SHARING_TYPE_INVITATION_SENT:
				return new Item\LogMessage\CalendarSharing\InvitationSent($context, $model);
		}
	}

	if ($typeId === TimelineType::TASK)
	{
		switch ($typeCategoryId)
		{
			case CategoryType::DESCRIPTION_CHANGED:
				return new Item\LogMessage\Tasks\TaskDescriptionChanged($context, $model);

			case CategoryType::RESULT_ADDED:
				return new Item\LogMessage\Tasks\TaskResultAdded($context, $model);

			case CategoryType::CHECKLIST_ADDED:
				return new Item\LogMessage\Tasks\TaskChecklistAdded($context, $model);

			case CategoryType::DEADLINE_CHANGED:
				return new Item\LogMessage\Tasks\TaskDeadlineChanged($context, $model);

			case CategoryType::VIEWED:
				return new Item\LogMessage\Tasks\TaskViewed($context, $model);

			case CategoryType::PING_SENT:
				return new Item\LogMessage\Tasks\TaskPingSent($context, $model);

			case CategoryType::COMMENT_ADD:
				return new Item\LogMessage\Tasks\TaskCommentAdded($context, $model);

			case CategoryType::ALL_COMMENT_VIEWED:
				return new Item\LogMessage\Tasks\TaskCommentsViewed($context, $model);

			case CategoryType::TASK_ADDED:
				return new Item\LogMessage\Tasks\TaskCreation($context, $model);

			case CategoryType::STATUS_CHANGED:
				return new Item\LogMessage\Tasks\TaskStatusChanged($context, $model);

			case CategoryType::EXPIRED:
				return new Item\LogMessage\Tasks\TaskDeadlineExpired($context, $model);

			case CategoryType::DISAPPROVED:
				return new Item\LogMessage\Tasks\TaskDisapproved($context, $model);

			case CategoryType::RESPONSIBLE_CHANGED:
				return new Item\LogMessage\Tasks\TaskResponsibleChanged($context, $model);

			case CategoryType::ACCOMPLICE_ADDED:
				return new Item\LogMessage\Tasks\TaskAccompliceAdded($context, $model);

			case CategoryType::AUDITOR_ADDED:
				return new Item\LogMessage\Tasks\TaskAuditorAdded($context, $model);

			case CategoryType::GROUP_CHANGED:
				return new Item\LogMessage\Tasks\TaskGroupChanged($context, $model);
		}
	}

	return new Item\Compatible\HistoryItem(
		$context,
		(new Item\Compatible\Model())
			->setData($rawData)
			->setId((int)$rawData['ID'])
			->setIsFixed($rawData['IS_FIXED'] === 'Y')
	);
}