...Человеческий поиск в разработке...
- Модуль: 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; }