CAllCrmQuote::Add

  1. Bitrix24 API (v. 23.675.0)
  2. crm
  3. CAllCrmQuote
  4. Add
  • Модуль: crm
  • Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_quote.php
  • Класс: \CAllCrmQuote
  • Вызов: CAllCrmQuote::Add
public function Add(&$arFields, $bUpdateSearch = true, $options = array())
{
	$this->lastErrors = null;

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

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

	if($this->isUseOperation())
	{
		return $this->getCompatibilityAdapter()->performAdd($arFields, $options);
	}

	global $DB;

	$this->LAST_ERROR = '';
	$iUserId = isset($options['CURRENT_USER'])
		? (int)$options['CURRENT_USER'] : CCrmSecurityHelper::GetCurrentUserID();

	if (isset($arFields['ID']))
		unset($arFields['ID']);

	if (isset($arFields['DATE_CREATE']))
		unset($arFields['DATE_CREATE']);
	$arFields['~DATE_CREATE'] = $DB->CurrentTimeFunction();
	$arFields['~DATE_MODIFY'] = $DB->CurrentTimeFunction();

	if (!isset($arFields['CREATED_BY_ID']) || (int)$arFields['CREATED_BY_ID'] <= 0)
		$arFields['CREATED_BY_ID'] = $iUserId;
	if (!isset($arFields['MODIFY_BY_ID']) || (int)$arFields['MODIFY_BY_ID'] <= 0)
		$arFields['MODIFY_BY_ID'] = $iUserId;

	if(isset($arFields['ASSIGNED_BY_ID']) && is_array($arFields['ASSIGNED_BY_ID']))
	{
		$arFields['ASSIGNED_BY_ID'] = count($arFields['ASSIGNED_BY_ID']) > 0 ? intval($arFields['ASSIGNED_BY_ID'][0]) : $iUserId;
	}

	if (!isset($arFields['ASSIGNED_BY_ID']) || (int)$arFields['ASSIGNED_BY_ID'] <= 0)
		$arFields['ASSIGNED_BY_ID'] = $iUserId;

	// person type
	if (!isset($arFields['PERSON_TYPE_ID']) || intval($arFields['PERSON_TYPE_ID']) <= 0)
	{
		$arFields['PERSON_TYPE_ID'] = 0;
		$arPersonTypes = CCrmPaySystem::getPersonTypeIDs();
		if (isset($arPersonTypes['CONTACT']) && (!isset($arFields['COMPANY_ID']) || intval($arFields['COMPANY_ID']) <= 0))
			$arFields['PERSON_TYPE_ID'] = intval($arPersonTypes['CONTACT']);
		else if (isset($arPersonTypes['COMPANY']) && isset($arFields['COMPANY_ID']) && intval($arFields['COMPANY_ID']) > 0)
			$arFields['PERSON_TYPE_ID'] = intval($arPersonTypes['COMPANY']);
	}

	// storage type
	$storageTypeID = isset($arFields['STORAGE_TYPE_ID'])
		? intval($arFields['STORAGE_TYPE_ID']) : CCrmQuoteStorageType::Undefined;
	if($storageTypeID === CCrmQuoteStorageType::Undefined
		|| !CCrmQuoteStorageType::IsDefined($storageTypeID))
	{
		$storageTypeID = self::GetDefaultStorageTypeID();
	}
	$arFields['STORAGE_TYPE_ID'] = $storageTypeID;


	// storage elements
	$storageElementIDs = (isset($arFields['STORAGE_ELEMENT_IDS']) && is_array($arFields['STORAGE_ELEMENT_IDS']))
		? $arFields['STORAGE_ELEMENT_IDS'] : null;
	$arFields['STORAGE_ELEMENT_IDS'] = null;
	if ($storageElementIDs !== null)
	{
		$storageElementIDs = self::NormalizeStorageElementIDs($storageElementIDs);
		$arFields['STORAGE_ELEMENT_IDS'] = serialize($storageElementIDs);
	}

	if (!$this->CheckFields($arFields, false, $options))
	{
		$result = false;
		$arFields['RESULT_MESSAGE'] = &$this->LAST_ERROR;
	}
	else
	{
		if (!isset($arFields['STATUS_ID']))
			$arFields['STATUS_ID'] = 'DRAFT';
		$arAttr = array();
		if (!empty($arFields['STATUS_ID']))
			$arAttr['STATUS_ID'] = $arFields['STATUS_ID'];
		if (!empty($arFields['OPENED']))
			$arAttr['OPENED'] = $arFields['OPENED'];

		$sPermission = 'ADD';
		if (isset($arFields['PERMISSION']))
		{
			if ($arFields['PERMISSION'] == 'IMPORT')
				$sPermission = 'IMPORT';
			unset($arFields['PERMISSION']);
		}

		if($this->bCheckPermission)
		{
			$arEntityAttr = self::BuildEntityAttr($iUserId, $arAttr);
			$userPerms =  $iUserId == CCrmPerms::GetCurrentUserID() ? $this->cPerms : CCrmPerms::GetUserPermissions($iUserId);
			$sEntityPerm = $userPerms->GetPermType(self::$TYPE_NAME, $sPermission, $arEntityAttr);
			if ($sEntityPerm == BX_CRM_PERM_NONE)
			{
				$this->LAST_ERROR = GetMessage('CRM_PERMISSION_DENIED');
				$arFields['RESULT_MESSAGE'] = &$this->LAST_ERROR;
				return false;
			}

			$assignedByID = intval($arFields['ASSIGNED_BY_ID']);
			if ($sEntityPerm == BX_CRM_PERM_SELF && $assignedByID != $iUserId)
			{
				$arFields['ASSIGNED_BY_ID'] = $iUserId;
			}
			if ($sEntityPerm == BX_CRM_PERM_OPEN && $iUserId == $assignedByID)
			{
				$arFields['OPENED'] = 'Y';
			}
		}

		$assignedByID = intval($arFields['ASSIGNED_BY_ID']);
		$arEntityAttr = self::BuildEntityAttr($assignedByID, $arAttr);
		$userPerms =  $assignedByID == CCrmPerms::GetCurrentUserID() ? $this->cPerms : CCrmPerms::GetUserPermissions($assignedByID);
		$sEntityPerm = $userPerms->GetPermType(self::$TYPE_NAME, $sPermission, $arEntityAttr);
		$this->PrepareEntityAttrs($arEntityAttr, $sEntityPerm);

		$arFields = array_merge($arFields, \CCrmAccountingHelper::calculateAccountingData($arFields, [], true));

		$arFields['CLOSED'] = self::GetStatusSemantics($arFields['STATUS_ID']) === 'process' ? 'N' : 'Y';

		$now = ConvertTimeStamp(time() + CTimeZone::GetOffset(), 'FULL', SITE_ID);
		if (!isset($arFields['BEGINDATE'][0]))
		{
			$arFields['BEGINDATE'] = $now;
		}

		if($arFields['CLOSED'] === 'Y'
			&& (!isset($arFields['CLOSEDATE']) || $arFields['CLOSEDATE'] === ''))
		{
			$arFields['CLOSEDATE'] = $now;
		}

		//region Preparation of contacts
		$contactBindings = isset($arFields['CONTACT_BINDINGS']) && is_array($arFields['CONTACT_BINDINGS'])
			? $arFields['CONTACT_BINDINGS'] : null;
		$contactIDs = isset($arFields['CONTACT_IDS']) && is_array($arFields['CONTACT_IDS'])
			? $arFields['CONTACT_IDS'] : null;
		unset($arFields['CONTACT_IDS']);
		//For backward compatibility only
		$contactID = isset($arFields['CONTACT_ID']) ? max((int)$arFields['CONTACT_ID'], 0) : null;
		if($contactID !== null && $contactIDs === null && $contactBindings === null)
		{
			$contactIDs = array();
			if($contactID > 0)
			{
				$contactIDs[] = $contactID;
			}
		}

		if(is_array($contactBindings))
		{
			$contactIDs = \Bitrix\Crm\Binding\EntityBinding::prepareEntityIDs(
				CCrmOwnerType::Contact,
				$contactBindings
			);
		}
		elseif(is_array($contactIDs))
		{
			$contactBindings = \Bitrix\Crm\Binding\EntityBinding::prepareEntityBindings(
				\CCrmOwnerType::Contact,
				$contactIDs
			);

			\Bitrix\Crm\Binding\EntityBinding::markFirstAsPrimary($contactBindings);
		}
		//endregion

		self::getLastActivityAdapter()->performAdd($arFields, $options);
		self::getCommentsAdapter()->normalizeFields(null, $arFields);

		//region Rise BeforeAdd event
		foreach (GetModuleEvents('crm', 'OnBeforeCrmQuoteAdd', true) as $arEvent)
		{
			if(ExecuteModuleEventEx($arEvent, array(&$arFields)) === false)
			{
				if(isset($arFields['RESULT_MESSAGE']))
				{
					$this->LAST_ERROR = $arFields['RESULT_MESSAGE'];
				}
				else
				{
					$this->LAST_ERROR = GetMessage('CRM_QUOTE_CREATION_CANCELED_MSGVER_1', ['#NAME#' => $arEvent['TO_NAME']]);
					$arFields['RESULT_MESSAGE'] = &$this->LAST_ERROR;
				}
				return false;
			}
		}
		//endregion

		$clobFieldNames = array('COMMENTS', 'CONTENT', 'STORAGE_ELEMENT_IDS');
		$clobFields = array();
		foreach ($clobFieldNames as $fieldName)
		{
			if (array_key_exists($fieldName, $arFields))
				$clobFields[] = $fieldName;
		}

		$this->normalizeEntityFields($arFields);
		$ID = (int) $DB->Add(self::TABLE_NAME, $arFields, $clobFields, 'FILE: '.__FILE__.'
LINE: '.__LINE__); if(defined('BX_COMP_MANAGED_CACHE')) { $GLOBALS['CACHE_MANAGER']->CleanDir('b_crm_quote'); } if (!self::SetQuoteNumber($ID)) { $this->LAST_ERROR = GetMessage('CRM_ERROR_QUOTE_NUMBER_IS_NOT_SET_MSGVER_1'); $arFields['RESULT_MESSAGE'] = &$this->LAST_ERROR; return false; } CCrmEntityHelper::NormalizeUserFields($arFields, self::$sUFEntityID, $GLOBALS['USER_FIELD_MANAGER'], array('IS_NEW' => true)); $GLOBALS['USER_FIELD_MANAGER']->Update(self::$sUFEntityID, $ID, $arFields); $securityRegisterOptions = (new \Bitrix\Crm\Security\Controller\RegisterOptions()) ->setEntityAttributes($arEntityAttr) ; Crm\Security\Manager::getEntityController(CCrmOwnerType::Quote) ->register(self::$TYPE_NAME, $ID, $securityRegisterOptions) ; if(is_array($storageElementIDs)) { CCrmQuote::DoSaveElementIDs($ID, $storageTypeID, $storageElementIDs); } unset($storageTypeID, $storageElementIDs); // tracking of entity Tracking\Entity::onAfterAdd(CCrmOwnerType::Quote, $ID, $arFields); if($bUpdateSearch) { $arFilterTmp = Array('ID' => $ID); if (!$this->bCheckPermission) $arFilterTmp["CHECK_PERMISSIONS"] = "N"; CCrmSearch::UpdateSearch($arFilterTmp, 'QUOTE', true); } $result = $arFields['ID'] = $ID; if (isset($GLOBALS["USER"]) && isset($arFields['COMPANY_ID']) && intval($arFields['COMPANY_ID']) > 0) { CUserOptions::SetOption('crm', 'crm_company_search', array('last_selected' => $arFields['COMPANY_ID'])); } //region Save contacts if(!empty($contactBindings)) { QuoteContactTable::bindContacts($ID, $contactBindings); if (isset($GLOBALS['USER'])) { CUserOptions::SetOption( 'crm', 'crm_contact_search', array('last_selected' => $contactIDs[count($contactIDs) - 1]) ); } } //endregion //region Search content index Bitrix\Crm\Search\SearchContentBuilderFactory::create(CCrmOwnerType::Quote)->build($ID); //endregion self::getCommentsAdapter()->performAdd($arFields, $options); //region Rise AfterAdd event foreach (GetModuleEvents('crm', 'OnAfterCrmQuoteAdd', true) as $arEvent) ExecuteModuleEventEx($arEvent, array(&$arFields)); //endregion } return $result; }

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