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;
}