CCrmActivityRestProxy::innerAdd

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. CCrmActivityRestProxy
  4. innerAdd
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/restservice.php
  • Класс: \CCrmActivityRestProxy
  • Вызов: CCrmActivityRestProxy::innerAdd
protected function innerAdd(&$fields, &$errors, array $params = null)
{
	$ownerTypeID = isset($fields['OWNER_TYPE_ID']) ? intval($fields['OWNER_TYPE_ID']) : 0;
	$ownerID = isset($fields['OWNER_ID']) ? intval($fields['OWNER_ID']) : 0;

	$bindings = array();
	if($ownerTypeID > 0 && $ownerID > 0)
	{
		$bindings["{$ownerTypeID}_{$ownerID}"] = array(
			'OWNER_TYPE_ID' => $ownerTypeID,
			'OWNER_ID' => $ownerID
		);
	}

	if(!isset($fields['SUBJECT']) || trim($fields['SUBJECT']) === '')
	{
		$errors[] = 'The field SUBJECT is not defined or empty.';
		return false;
	}

	$responsibleID = isset($fields['RESPONSIBLE_ID']) ? intval($fields['RESPONSIBLE_ID']) : 0;
	if($responsibleID <= 0 && $ownerTypeID > 0 && $ownerID > 0)
	{
		$fields['RESPONSIBLE_ID'] = $responsibleID = CCrmOwnerType::GetResponsibleID($ownerTypeID, $ownerID);
	}

	if($responsibleID <= 0)
	{
		$responsibleID = CCrmSecurityHelper::GetCurrentUserID();
	}

	if($responsibleID <= 0)
	{
		$errors[] = 'The field RESPONSIBLE_ID is not defined or invalid.';
		return false;
	}

	if (isset($fields['PROVIDER_ID']) && empty($fields['TYPE_ID']))
		$fields['TYPE_ID'] = CCrmActivityType::Provider;

	$typeID = isset($fields['TYPE_ID']) ? intval($fields['TYPE_ID']) : CCrmActivityType::Undefined;
	if(!CCrmActivityType::IsDefined($typeID))
	{
		$errors[] = 'The field TYPE_ID is not defined or invalid.';
		return false;
	}

	if ($typeID === CCrmActivityType::Provider && ($provider = CCrmActivity::GetActivityProvider($fields)) === null)
	{
		$errors[] = 'The custom activity without provider is not supported in current context.';
		return false;
	}

	if(!in_array($typeID, array(CCrmActivityType::Call, CCrmActivityType::Meeting, CCrmActivityType::Email, CCrmActivityType::Provider), true))
	{
		$errors[] = 'The activity type "'.CCrmActivityType::ResolveDescription($typeID).' is not supported in current context".';
		return false;
	}

	$isRestActivity = isset($fields['PROVIDER_ID']) && $fields['PROVIDER_ID'] === \Bitrix\Crm\Activity\Provider\RestApp::getId();

	if (($fields['PROVIDER_ID'] ?? null) === \Bitrix\Crm\Activity\Provider\ConfigurableRestApp::getId())
	{
		$errors[] = 'Use crm.activity.configurable.add for this activity provider';

		return false;
	}

	if ($isRestActivity)
	{
		$clientId = $this->getServer()->getClientId();
		$application = $clientId ? \Bitrix\Rest\AppTable::getByClientId($clientId) : null;

		if (!$application)
		{
			$errors[] = 'Application context required.';
			return false;
		}

		$fields['ASSOCIATED_ENTITY_ID'] = $application['ID'];
	}

	$description = $fields['DESCRIPTION'] ?? '';
	$descriptionType = isset($fields['DESCRIPTION_TYPE']) ? intval($fields['DESCRIPTION_TYPE']) : CCrmContentType::PlainText;
	if($description !== '' && !$isRestActivity && CCrmActivity::AddEmailSignature($description, $descriptionType))
	{
		$fields['DESCRIPTION'] = $description;
	}

	$direction = isset($fields['DIRECTION']) ? intval($fields['DIRECTION']) : CCrmActivityDirection::Undefined;
	$completed = isset($fields['COMPLETED']) && mb_strtoupper($fields['COMPLETED']) === 'Y';
	$communications = isset($fields['COMMUNICATIONS']) && is_array($fields['COMMUNICATIONS'])
		? $fields['COMMUNICATIONS'] : array();

	$this->internalizeCommunications($ownerTypeID, $ownerID, $typeID, $communications, $bindings);

	if(empty($communications) && $typeID !== CCrmActivityType::Provider)
	{
		$errors[] = 'The field COMMUNICATIONS is not defined or invalid.';
		return false;
	}

	if(($typeID === CCrmActivityType::Call || $typeID === CCrmActivityType::Meeting)
		&& count($communications) > 1)
	{
		$errors[] = 'The only one communication is allowed for activity of specified type.';
		return false;
	}

	if(empty($bindings))
	{
		$errors[] = 'Could not build binding. Please ensure that owner info and communications are defined correctly.';
		return false;
	}

	foreach($bindings as $binding)
	{
		$bindingOwnerTypeName = CCrmOwnerType::ResolveName($binding['OWNER_TYPE_ID']);
		if($bindingOwnerTypeName === '')
		{
			$bindingOwnerTypeName = "[{$binding['OWNER_TYPE_ID']}]";
		}

		$factory = \Bitrix\Crm\Service\Container::getInstance()->getFactory($binding['OWNER_TYPE_ID']);
		if($factory === null)
		{
			$errors[] = "Entity type '{$bindingOwnerTypeName}' is not supported in current context";
			return false;
		}

		if(!$factory->getItem($binding['OWNER_ID']))
		{
			$errors[] = "Could not find '{$bindingOwnerTypeName}' with ID: {$binding['OWNER_ID']}";
			return false;
		}

		if(!CCrmActivity::CheckUpdatePermission($binding['OWNER_TYPE_ID'], $binding['OWNER_ID']))
		{
			$errors[] = 'Access denied.';
			return false;
		}
	}

	$fields['BINDINGS'] = array_values($bindings);
	$fields['COMMUNICATIONS'] = $communications;
	$storageTypeID = $fields['STORAGE_TYPE_ID'] = CCrmActivity::GetDefaultStorageTypeID();
	$fields['STORAGE_ELEMENT_IDS'] = array();

	if($storageTypeID === StorageType::WebDav)
	{
		$webdavElements = isset($fields['WEBDAV_ELEMENTS']) && is_array($fields['WEBDAV_ELEMENTS'])
			? $fields['WEBDAV_ELEMENTS'] : array();

		foreach($webdavElements as &$element)
		{
			$elementID = isset($element['ELEMENT_ID']) ? intval($element['ELEMENT_ID']) : 0;
			if($elementID > 0)
			{
				$fields['STORAGE_ELEMENT_IDS'][] = $elementID;
			}
		}
		unset($element);
	}
	elseif($storageTypeID === StorageType::Disk)
	{
		$diskFiles = isset($fields['FILES']) && is_array($fields['FILES'])
			? $fields['FILES'] : array();

		if(empty($diskFiles))
		{
			//For backward compatibility only
			$diskFiles = isset($fields['WEBDAV_ELEMENTS']) && is_array($fields['WEBDAV_ELEMENTS'])
				? $fields['WEBDAV_ELEMENTS'] : array();
		}

		foreach($diskFiles as &$fileInfo)
		{
			$fileID = isset($fileInfo['FILE_ID']) ? (int)$fileInfo['FILE_ID'] : 0;
			if($fileID > 0)
			{
				$fields['STORAGE_ELEMENT_IDS'][] = $fileID;
			}
		}
		unset($fileInfo);
	}

	if(!($ID = CCrmActivity::Add($fields)))
	{
		$errors[] = CCrmActivity::GetLastErrorMessage();
		return false;
	}

	if($completed
		&& $typeID === CCrmActivityType::Email
		&& $direction === CCrmActivityDirection::Outgoing)
	{
		$sendErrors = array();
		if(!CCrmActivityEmailSender::TrySendEmail($ID, $fields, $sendErrors))
		{
			foreach($sendErrors as &$error)
			{
				$code = $error['CODE'];
				if($code === CCrmActivityEmailSender::ERR_CANT_LOAD_SUBSCRIBE)
				{
					$errors[] = 'Email send error. Failed to load module "subscribe".';
				}
				elseif($code === CCrmActivityEmailSender::ERR_INVALID_DATA)
				{
					$errors[] = 'Email send error. Invalid data.';
				}
				elseif($code === CCrmActivityEmailSender::ERR_INVALID_EMAIL)
				{
					$errors[] = 'Email send error. Invalid email is specified.';
				}
				elseif($code === CCrmActivityEmailSender::ERR_CANT_FIND_EMAIL_FROM)
				{
					$errors[] = 'Email send error. "From" is not found.';
				}
				elseif($code === CCrmActivityEmailSender::ERR_CANT_FIND_EMAIL_TO)
				{
					$errors[] = 'Email send error. "To" is not found.';
				}
				elseif($code === CCrmActivityEmailSender::ERR_CANT_ADD_POSTING)
				{
					$errors[] = 'Email send error. Failed to add posting. Please see details below.';
				}
				elseif($code === CCrmActivityEmailSender::ERR_CANT_SAVE_POSTING_FILE)
				{
					$errors[] = 'Email send error. Failed to save posting file. Please see details below.';
				}
				elseif($code === CCrmActivityEmailSender::ERR_CANT_UPDATE_ACTIVITY)
				{
					$errors[] = 'Email send error. Failed to update activity.';
				}
				else
				{
					$errors[] = 'Email send error. General error.';
				}

				$msg = $error['MESSAGE'] ?? '';
				if($msg !== '')
				{
					$errors[] = $msg;
				}
			}
			unset($error);
			return false;
		}

		addEventToStatFile(
			'crm',
			'send_email_message',
			sprintf('rest_%s', $this->getServer()->getClientId() ?: 'undefined'),
			trim(trim($fields['SETTINGS']['MESSAGE_HEADERS']['Message-Id']), '<>')
		);
	}
	return $ID;
}

Добавить комментарий