public function Execute() { if (!CModule::IncludeModule('crm')) { return CBPActivityExecutionStatus::Closed; } $rootActivity = $this->GetRootActivity(); $documentId = $rootActivity->GetDocumentId(); $arDocumentInfo = explode('_', $documentId['2']); $documentService = $this->workflow->GetService('DocumentService'); $arEntity[$arDocumentInfo[1]] = array('ENTITY_TYPE' => $arDocumentInfo[0], 'ENTITY_ID' => (int) $arDocumentInfo[1]); $arFields = array('ENTITY' => $arEntity, 'EVENT_ID' => $this->EventType, 'EVENT_TEXT_1' => $this->EventText, 'USER_ID' => 0); $CCrmEvent = new CCrmEvent(); if (!$CCrmEvent->Add($arFields, false)) { global $APPLICATION; $e = $APPLICATION->GetException(); throw new Exception($e->GetString()); } return CBPActivityExecutionStatus::Closed; }
if (is_array($arProductRows)) { foreach ($arProductRows as &$arProductRow) { $originID = $arProductRow['ORIGIN_ID']; $arProduct = CCrmProduct::GetByOriginID($originID, $catalogID); if (!is_array($arProduct)) { continue; } CCrmDeal::SaveProductRows($dealID, array(array('PRODUCT_ID' => intval($arProduct['ID']), 'PRICE' => doubleval($arProduct['PRICE']), 'QUANTITY' => 1))); } } } // Add event require_once "event.demo.php"; $CCrmEvent = new CCrmEvent(); foreach ($arEvents as $ID => $arParams) { $arEvents[$ID]['ID'] = $CCrmEvent->Add($arParams); } // Add relation $arParams = array('COMPANY_ID' => $arCompany['39']['ID'], 'CONTACT_ID' => $arContacts['51']['ID']); $CCrmLead->Update($arLeads['57']['ID'], $arParams); // Add activity require_once "activity.demo.php"; $CCrmActivity = new CCrmActivity(); foreach ($arActivities as $ID => $arParams) { $activityId = $CCrmActivity->Add($arParams["FIELDS"], false, false); CCrmActivity::SaveCommunications($activityId, array($arParams["COMMUNICATIONS"]), $arParams["FIELDS"], false, false); } //Add invoice CCrmInvoice::installDisableSaleEvents(); require_once "invoice.demo.php"; $CCrmInvoice = new CCrmInvoice();
public static function TrySendEmail($ID, &$arFields, &$arErrors) { global $APPLICATION; if (!CModule::IncludeModule('subscribe')) { $arErrors[] = array('CODE' => self::ERR_CANT_LOAD_SUBSCRIBE); return false; } $ID = intval($ID); if ($ID <= 0 && isset($arFields['ID'])) { $ID = intval($arFields['ID']); } if ($ID <= 0 || !is_array($arFields)) { $arErrors[] = array('CODE' => self::ERR_INVALID_DATA); return false; } $typeID = isset($arFields['TYPE_ID']) ? intval($arFields['TYPE_ID']) : CCrmActivityType::Undefined; if ($typeID !== CCrmActivityType::Email) { $arErrors[] = array('CODE' => self::ERR_INVALID_DATA); return false; } $urn = CCrmActivity::PrepareUrn($arFields); if (!($urn !== '' && CCrmActivity::Update($ID, array('URN' => $urn), false, false))) { $arErrors[] = array('CODE' => self::ERR_CANT_UPDATE_ACTIVITY); return false; } $settings = isset($arFields['SETTINGS']) && is_array($arFields['SETTINGS']) ? $arFields['SETTINGS'] : array(); // Creating Email --> $crmEmail = CCrmMailHelper::ExtractEmail(COption::GetOptionString('crm', 'mail', '')); $from = isset($settings['MESSAGE_FROM']) ? trim(strval($settings['MESSAGE_FROM'])) : ''; if ($from === '') { if ($crmEmail !== '') { $from = $crmEmail; } else { $arErrors[] = array('CODE' => self::ERR_CANT_FIND_EMAIL_FROM); } } elseif (!check_email($from)) { $arErrors[] = array('CODE' => self::ERR_INVALID_EMAIL, 'DATA' => array('EMAIL' => $from)); } //Save user email in settings --> if ($from !== CUserOptions::GetOption('crm', 'activity_email_addresser', '')) { CUserOptions::SetOption('crm', 'activity_email_addresser', $from); } //<-- Save user email in settings $to = array(); $commData = isset($arFields['COMMUNICATIONS']) ? $arFields['COMMUNICATIONS'] : array(); foreach ($commData as &$commDatum) { $commType = isset($commDatum['TYPE']) ? strtoupper(strval($commDatum['TYPE'])) : ''; $commValue = isset($commDatum['VALUE']) ? strval($commDatum['VALUE']) : ''; if ($commType !== 'EMAIL' || $commValue === '') { continue; } if (!check_email($commValue)) { $arErrors[] = array('CODE' => self::ERR_INVALID_EMAIL, 'DATA' => array('EMAIL' => $commValue)); continue; } $to[] = strtolower(trim($commValue)); } unset($commDatum); if (count($to) == 0) { $arErrors[] = array('CODE' => self::ERR_CANT_FIND_EMAIL_TO); } if (!empty($arErrors)) { return false; } // Try to resolve posting charset --> $postingCharset = ''; $siteCharset = defined('LANG_CHARSET') ? LANG_CHARSET : (defined('SITE_CHARSET') ? SITE_CHARSET : 'windows-1251'); $arSupportedCharset = explode(',', COption::GetOptionString('subscribe', 'posting_charset')); if (count($arSupportedCharset) === 0) { $postingCharset = $siteCharset; } else { foreach ($arSupportedCharset as $curCharset) { if (strcasecmp($curCharset, $siteCharset) === 0) { $postingCharset = $curCharset; break; } } if ($postingCharset === '') { $postingCharset = $arSupportedCharset[0]; } } //<-- Try to resolve posting charset $subject = isset($arFields['SUBJECT']) ? $arFields['SUBJECT'] : ''; $description = isset($arFields['DESCRIPTION']) ? $arFields['DESCRIPTION'] : ''; $descriptionType = isset($arFields['DESCRIPTION_TYPE']) ? intval($arFields['DESCRIPTION_TYPE']) : CCrmContentType::PlainText; $descriptionHtml = ''; if ($descriptionType === CCrmContentType::Html) { $descriptionHtml = $description; } elseif ($descriptionType === CCrmContentType::BBCode) { $parser = new CTextParser(); $descriptionHtml = $parser->convertText($description); } elseif ($descriptionType === CCrmContentType::PlainText) { $descriptionHtml = htmlspecialcharsbx($description); } $postingData = array('STATUS' => 'D', 'FROM_FIELD' => $from, 'TO_FIELD' => $from, 'BCC_FIELD' => implode(',', $to), 'SUBJECT' => $subject, 'BODY_TYPE' => 'html', 'BODY' => $descriptionHtml, 'DIRECT_SEND' => 'Y', 'SUBSCR_FORMAT' => 'html', 'CHARSET' => $postingCharset); CCrmActivity::InjectUrnInMessage($postingData, $urn, CCrmEMailCodeAllocation::GetCurrent()); $posting = new CPosting(); $postingID = $posting->Add($postingData); if ($postingID === false) { $arErrors[] = array('CODE' => self::ERR_CANT_ADD_POSTING, 'MESSAGE' => $posting->LAST_ERROR); return false; } $arUpdateFields = array('COMPLETED' => 'Y', 'ASSOCIATED_ENTITY_ID' => $postingID, 'SETTINGS' => $settings); $fromEmail = strtolower(trim(CCrmMailHelper::ExtractEmail($from))); if ($crmEmail !== '' && $fromEmail !== $crmEmail) { $arUpdateFields['SETTINGS']['MESSAGE_HEADERS'] = array('Reply-To' => "<{$fromEmail}>, <{$crmEmail}>"); } $arUpdateFields['SETTINGS']['IS_MESSAGE_SENT'] = true; if (!CCrmActivity::Update($ID, $arUpdateFields, false, false)) { $arErrors[] = array('CODE' => self::ERR_CANT_UPDATE_ACTIVITY); return false; } // <-- Creating Email // Attaching files --> $storageTypeID = isset($arFields['STORAGE_TYPE_ID']) ? intval($arFields['STORAGE_TYPE_ID']) : StorageType::Undefined; $storageElementsID = isset($arFields['STORAGE_ELEMENT_IDS']) && is_array($arFields['STORAGE_ELEMENT_IDS']) ? $arFields['STORAGE_ELEMENT_IDS'] : array(); $arRawFiles = StorageManager::makeFileArray($storageElementsID, $storageTypeID); foreach ($arRawFiles as &$arRawFile) { if (!$posting->SaveFile($postingID, $arRawFile)) { $arErrors[] = array('CODE' => self::ERR_CANT_SAVE_POSTING_FILE, 'MESSAGE' => $posting->LAST_ERROR); return false; } } unset($arRawFile); // <-- Attaching files // Sending Email --> if ($posting->ChangeStatus($postingID, 'P')) { $rsAgents = CAgent::GetList(array('ID' => 'DESC'), array('MODULE_ID' => 'subscribe', 'NAME' => 'CPosting::AutoSend(' . $postingID . ',%')); if (!$rsAgents->Fetch()) { CAgent::AddAgent('CPosting::AutoSend(' . $postingID . ',true);', 'subscribe', 'N', 0); } } // Try add event to entity $CCrmEvent = new CCrmEvent(); $ownerID = isset($arFields['OWNER_ID']) ? intval($arFields['OWNER_ID']) : 0; $ownerTypeID = isset($arFields['OWNER_TYPE_ID']) ? intval($arFields['OWNER_TYPE_ID']) : 0; if ($ownerID > 0 && $ownerTypeID > 0) { $eventText = ''; $eventText .= GetMessage('CRM_ACTIVITY_EMAIL_SUBJECT') . ': ' . $subject . "\n\r"; $eventText .= GetMessage('CRM_ACTIVITY_EMAIL_FROM') . ': ' . $from . "\n\r"; $eventText .= GetMessage('CRM_ACTIVITY_EMAIL_TO') . ': ' . implode(',', $to) . "\n\r\n\r"; $eventText .= $description; // Register event only for owner $CCrmEvent->Add(array('ENTITY' => array($ownerID => array('ENTITY_TYPE' => CCrmOwnerType::ResolveName($ownerTypeID), 'ENTITY_ID' => $ownerID)), 'EVENT_ID' => 'MESSAGE', 'EVENT_TEXT_1' => $eventText, 'FILES' => $arRawFiles)); } // <-- Sending Email return true; }
public static function CreateLogMessage(&$fields, $options = array()) { if (!CModule::IncludeModule('socialnetwork')) { return false; } global $APPLICATION, $DB; if (!is_array($options)) { $options = array(); } $entityTypeID = isset($fields['ENTITY_TYPE_ID']) ? intval($fields['ENTITY_TYPE_ID']) : CCrmOwnerType::Undefined; if (!CCrmOwnerType::IsDefined($entityTypeID)) { $fields['ERROR'] = GetMessage('CRM_LF_MSG_ENTITY_TYPE_NOT_FOUND'); return false; } $entityType = CCrmOwnerType::ResolveName($entityTypeID); $entityID = isset($fields['ENTITY_ID']) ? intval($fields['ENTITY_ID']) : 0; if ($entityID < 0) { $fields['ERROR'] = GetMessage('CRM_LF_MSG_ENTITY_TYPE_NOT_FOUND'); return false; } $message = isset($fields['MESSAGE']) && is_string($fields['MESSAGE']) ? $fields['MESSAGE'] : ''; if ($message === '') { $fields['ERROR'] = GetMessage('CRM_LF_MSG_EMPTY'); return false; } $title = isset($fields['TITLE']) && is_string($fields['TITLE']) ? $fields['TITLE'] : ''; if ($title === '') { $title = self::UntitledMessageStub; } $userID = isset($fields['USER_ID']) ? intval($fields['USER_ID']) : 0; if ($userID <= 0) { $userID = CCrmSecurityHelper::GetCurrentUserID(); } $bbCodeParser = new CTextParser(); $bbCodeParser->allow["HTML"] = "Y"; $eventText = $bbCodeParser->convert4mail($message); $CCrmEvent = new CCrmEvent(); $eventID = $CCrmEvent->Add(array('ENTITY_TYPE' => $entityType, 'ENTITY_ID' => $entityID, 'EVENT_ID' => 'INFO', 'EVENT_TYPE' => 0, 'EVENT_TEXT_1' => $eventText, 'DATE_CREATE' => ConvertTimeStamp(time() + CTimeZone::GetOffset(), 'FULL', SITE_ID), 'FILES' => array())); if (is_string($eventID)) { //MS SQL RETURNS STRING INSTEAD INT $eventID = intval($eventID); } if (!(is_int($eventID) && $eventID > 0)) { $fields['ERROR'] = 'Could not create event'; return false; } $liveFeedEntityType = CCrmLiveFeedEntity::GetByEntityTypeID($entityTypeID); $eventID = CCrmLiveFeedEvent::GetEventID($liveFeedEntityType, CCrmLiveFeedEvent::Message); $eventFields = array('EVENT_ID' => $eventID, '=LOG_DATE' => $DB->CurrentTimeFunction(), 'TITLE' => $title, 'MESSAGE' => $message, 'TEXT_MESSAGE' => '', 'MODULE_ID' => 'crm_shared', 'CALLBACK_FUNC' => false, 'ENABLE_COMMENTS' => 'Y', 'PARAMS' => '', 'USER_ID' => $userID, 'ENTITY_TYPE' => $liveFeedEntityType, 'ENTITY_ID' => $entityID, 'SOURCE_ID' => $eventID, 'URL' => CCrmUrlUtil::AddUrlParams(CCrmOwnerType::GetShowUrl($entityTypeID, $entityID), array())); if (isset($fields['WEB_DAV_FILES']) && is_array($fields['WEB_DAV_FILES'])) { $eventFields = array_merge($eventFields, $fields['WEB_DAV_FILES']); } $sendMessage = isset($options['SEND_MESSAGE']) && is_bool($options['SEND_MESSAGE']) ? $options['SEND_MESSAGE'] : false; $logEventID = CSocNetLog::Add($eventFields, $sendMessage); if (is_int($logEventID) && $logEventID > 0) { $arSocnetRights = $fields["RIGHTS"]; if (!empty($arSocnetRights)) { $socnetPermsAdd = array(); foreach ($arSocnetRights as $perm_tmp) { if (preg_match('/^SG(\\d+)$/', $perm_tmp, $matches)) { if (!in_array("SG" . $matches[1] . "_" . SONET_ROLES_USER, $arSocnetRights)) { $socnetPermsAdd[] = "SG" . $matches[1] . "_" . SONET_ROLES_USER; } if (!in_array("SG" . $matches[1] . "_" . SONET_ROLES_MODERATOR, $arSocnetRights)) { $socnetPermsAdd[] = "SG" . $matches[1] . "_" . SONET_ROLES_MODERATOR; } if (!in_array("SG" . $matches[1] . "_" . SONET_ROLES_OWNER, $arSocnetRights)) { $socnetPermsAdd[] = "SG" . $matches[1] . "_" . SONET_ROLES_OWNER; } } } if (count($socnetPermsAdd) > 0) { $arSocnetRights = array_merge($arSocnetRights, $socnetPermsAdd); } CSocNetLogRights::DeleteByLogID($logEventID); CSocNetLogRights::Add($logEventID, $arSocnetRights); if (array_key_exists("UF_SONET_LOG_DOC", $eventFields) && is_array($eventFields["UF_SONET_LOG_DOC"]) && count($eventFields["UF_SONET_LOG_DOC"]) > 0) { if (!in_array("U" . $userID, $arSocnetRights)) { $arSocnetRights[] = "U" . $userID; } CSocNetLogTools::SetUFRights($eventFields["UF_SONET_LOG_DOC"], $arSocnetRights); } } $arUpdateFields = array("RATING_TYPE_ID" => "LOG_ENTRY", "RATING_ENTITY_ID" => $logEventID); CSocNetLog::Update($logEventID, $arUpdateFields); self::RegisterOwnershipRelations($logEventID, $eventID, $fields); $eventFields["LOG_ID"] = $logEventID; CCrmLiveFeed::CounterIncrement($eventFields); return $logEventID; } $ex = $APPLICATION->GetException(); $fields['ERROR'] = $ex->GetString(); return false; }
public function Update($ID, array &$arFields, $bCompare = true, $bUpdateSearch = true, $options = array()) { global $DB; $this->LAST_ERROR = ''; $ID = (int) $ID; if (!is_array($options)) { $options = array(); } $arFilterTmp = array('ID' => $ID); if (!$this->bCheckPermission) { $arFilterTmp['CHECK_PERMISSIONS'] = 'N'; } $obRes = self::GetListEx(array(), $arFilterTmp); if (!($arRow = $obRes->Fetch())) { return false; } $iUserId = CCrmSecurityHelper::GetCurrentUserID(); if (isset($arFields['DATE_CREATE'])) { unset($arFields['DATE_CREATE']); } if (isset($arFields['DATE_MODIFY'])) { unset($arFields['DATE_MODIFY']); } $arFields['~DATE_MODIFY'] = $DB->CurrentTimeFunction(); if (!isset($arFields['MODIFY_BY_ID']) || $arFields['MODIFY_BY_ID'] <= 0) { $arFields['MODIFY_BY_ID'] = $iUserId; } if (isset($arFields['ASSIGNED_BY_ID']) && $arFields['ASSIGNED_BY_ID'] <= 0) { unset($arFields['ASSIGNED_BY_ID']); } $assignedByID = (int) (isset($arFields['ASSIGNED_BY_ID']) ? $arFields['ASSIGNED_BY_ID'] : $arRow['ASSIGNED_BY_ID']); $bResult = false; if (!$this->CheckFields($arFields, $ID, $options)) { $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } else { if ($this->bCheckPermission && !CCrmAuthorizationHelper::CheckUpdatePermission(self::$TYPE_NAME, $ID, $this->cPerms)) { $this->LAST_ERROR = GetMessage('CRM_PERMISSION_DENIED'); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; return false; } $beforeEvents = GetModuleEvents('crm', 'OnBeforeCrmDealUpdate'); while ($arEvent = $beforeEvents->Fetch()) { if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false) { if (isset($arFields['RESULT_MESSAGE'])) { $this->LAST_ERROR = $arFields['RESULT_MESSAGE']; } else { $this->LAST_ERROR = GetMessage('CRM_DEAL_UPDATE_CANCELED', array('#NAME#' => $arEvent['TO_NAME'])); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } return false; } } $arAttr = array(); $arAttr['STAGE_ID'] = !empty($arFields['STAGE_ID']) ? $arFields['STAGE_ID'] : $arRow['STAGE_ID']; $arAttr['OPENED'] = !empty($arFields['OPENED']) ? $arFields['OPENED'] : $arRow['OPENED']; $arEntityAttr = self::BuildEntityAttr($assignedByID, $arAttr); $sEntityPerm = $this->cPerms->GetPermType('DEAL', 'WRITE', $arEntityAttr); $this->PrepareEntityAttrs($arEntityAttr, $sEntityPerm); //Prevent 'OPENED' field change by user restricted by BX_CRM_PERM_OPEN permission if ($sEntityPerm === BX_CRM_PERM_OPEN && isset($arFields['OPENED']) && $arFields['OPENED'] !== 'Y' && $assignedByID !== $iUserId) { $arFields['OPENED'] = 'Y'; } if (isset($arFields['ASSIGNED_BY_ID']) && $arRow['ASSIGNED_BY_ID'] != $arFields['ASSIGNED_BY_ID']) { CCrmEvent::SetAssignedByElement($arFields['ASSIGNED_BY_ID'], 'DEAL', $ID); } $sonetEventData = array(); if ($bCompare) { $arEvents = self::CompareFields($arRow, $arFields, $this->bCheckPermission); foreach ($arEvents as $arEvent) { $arEvent['ENTITY_TYPE'] = 'DEAL'; $arEvent['ENTITY_ID'] = $ID; $arEvent['EVENT_TYPE'] = 1; if (!isset($arEvent['USER_ID'])) { $arEvent['USER_ID'] = $iUserId; } $CCrmEvent = new CCrmEvent(); $eventID = $CCrmEvent->Add($arEvent, $this->bCheckPermission); if (is_int($eventID) && $eventID > 0) { $fieldID = isset($arEvent['ENTITY_FIELD']) ? $arEvent['ENTITY_FIELD'] : ''; if ($fieldID === '') { continue; } switch ($fieldID) { case 'STAGE_ID': $sonetEventData[CCrmLiveFeedEvent::Progress] = array('TYPE' => CCrmLiveFeedEvent::Progress, 'FIELDS' => array('TITLE' => GetMessage('CRM_DEAL_EVENT_UPDATE_STAGE'), 'MESSAGE' => '', 'PARAMS' => array('START_STATUS_ID' => $arRow['STAGE_ID'], 'FINAL_STATUS_ID' => $arFields['STAGE_ID']))); break; case 'ASSIGNED_BY_ID': $sonetEventData[CCrmLiveFeedEvent::Responsible] = array('TYPE' => CCrmLiveFeedEvent::Responsible, 'FIELDS' => array('TITLE' => GetMessage('CRM_DEAL_EVENT_UPDATE_ASSIGNED_BY'), 'MESSAGE' => '', 'PARAMS' => array('START_RESPONSIBLE_ID' => $arRow['ASSIGNED_BY_ID'], 'FINAL_RESPONSIBLE_ID' => $arFields['ASSIGNED_BY_ID']))); break; case 'CONTACT_ID': case 'COMPANY_ID': if (!isset($sonetEventData[CCrmLiveFeedEvent::Client])) { $oldContactID = isset($arRow['CONTACT_ID']) ? intval($arRow['CONTACT_ID']) : 0; $oldCompanyID = isset($arRow['COMPANY_ID']) ? intval($arRow['COMPANY_ID']) : 0; $sonetEventData[CCrmLiveFeedEvent::Client] = array('CODE' => 'CLIENT', 'TYPE' => CCrmLiveFeedEvent::Client, 'FIELDS' => array('TITLE' => GetMessage('CRM_DEAL_EVENT_UPDATE_CLIENT'), 'MESSAGE' => '', 'PARAMS' => array('START_CLIENT_CONTACT_ID' => $oldContactID, 'FINAL_CLIENT_CONTACT_ID' => isset($arFields['CONTACT_ID']) ? intval($arFields['CONTACT_ID']) : $oldContactID, 'START_CLIENT_COMPANY_ID' => $oldCompanyID, 'FINAL_CLIENT_COMPANY_ID' => isset($arFields['COMPANY_ID']) ? intval($arFields['COMPANY_ID']) : $oldCompanyID))); } break; case 'TITLE': $sonetEventData[CCrmLiveFeedEvent::Denomination] = array('TYPE' => CCrmLiveFeedEvent::Denomination, 'FIELDS' => array('TITLE' => GetMessage('CRM_DEAL_EVENT_UPDATE_TITLE'), 'MESSAGE' => '', 'PARAMS' => array('START_TITLE' => $arRow['TITLE'], 'FINAL_TITLE' => $arFields['TITLE']))); break; } } } // CHECK IF COMPANY/CONTACT WAS ADDED/REMOVED if (!isset($sonetEventData[CCrmLiveFeedEvent::Client]) && (!isset($arRow['COMPANY_ID']) && isset($arFields['COMPANY_ID']) || isset($arRow['COMPANY_ID']) && !isset($arFields['COMPANY_ID']) || !isset($arRow['CONTACT_ID']) && isset($arFields['CONTACT_ID']) || isset($arRow['CONTACT_ID']) && !isset($arFields['CONTACT_ID']))) { $sonetEventData[CCrmLiveFeedEvent::Client] = array('CODE' => 'CLIENT', 'TYPE' => CCrmLiveFeedEvent::Client, 'FIELDS' => array('TITLE' => GetMessage('CRM_DEAL_EVENT_UPDATE_CLIENT'), 'MESSAGE' => '', 'PARAMS' => array('START_CLIENT_CONTACT_ID' => isset($arRow['CONTACT_ID']) ? intval($arRow['CONTACT_ID']) : 0, 'FINAL_CLIENT_CONTACT_ID' => isset($arFields['CONTACT_ID']) ? intval($arFields['CONTACT_ID']) : 0, 'START_CLIENT_COMPANY_ID' => isset($arRow['COMPANY_ID']) ? intval($arRow['COMPANY_ID']) : 0, 'FINAL_CLIENT_COMPANY_ID' => isset($arFields['COMPANY_ID']) ? intval($arFields['COMPANY_ID']) : 0))); } } // Calculation of Account Data $accData = CCrmAccountingHelper::PrepareAccountingData(array('CURRENCY_ID' => isset($arFields['CURRENCY_ID']) ? $arFields['CURRENCY_ID'] : (isset($arRow['CURRENCY_ID']) ? $arRow['CURRENCY_ID'] : null), 'SUM' => isset($arFields['OPPORTUNITY']) ? $arFields['OPPORTUNITY'] : (isset($arRow['OPPORTUNITY']) ? $arRow['OPPORTUNITY'] : null), 'EXCH_RATE' => isset($arFields['EXCH_RATE']) ? $arFields['EXCH_RATE'] : (isset($arRow['EXCH_RATE']) ? $arRow['EXCH_RATE'] : null))); if (is_array($accData)) { $arFields['ACCOUNT_CURRENCY_ID'] = $accData['ACCOUNT_CURRENCY_ID']; $arFields['OPPORTUNITY_ACCOUNT'] = $accData['ACCOUNT_SUM']; } $accData = CCrmAccountingHelper::PrepareAccountingData(array('CURRENCY_ID' => isset($arFields['CURRENCY_ID']) ? $arFields['CURRENCY_ID'] : (isset($arRow['CURRENCY_ID']) ? $arRow['CURRENCY_ID'] : null), 'SUM' => isset($arFields['TAX_VALUE']) ? $arFields['TAX_VALUE'] : (isset($arRow['TAX_VALUE']) ? $arRow['TAX_VALUE'] : null), 'EXCH_RATE' => isset($arFields['EXCH_RATE']) ? $arFields['EXCH_RATE'] : (isset($arRow['EXCH_RATE']) ? $arRow['EXCH_RATE'] : null))); if (is_array($accData)) { $arFields['TAX_VALUE_ACCOUNT'] = $accData['ACCOUNT_SUM']; } $enableCloseDateSync = \Bitrix\Crm\Settings\DealSettings::isCloseDateSyncEnabled(); if (isset($arFields['STAGE_ID'])) { $now = ConvertTimeStamp(time(), 'SHORT', SITE_ID); $isFinalStage = self::GetStageSemantics($arFields['STAGE_ID']) !== 'process'; $isStageChanged = !isset($arRow['STAGE_ID']) || $arRow['STAGE_ID'] !== $arFields['STAGE_ID']; $arFields['CLOSED'] = $isFinalStage ? 'Y' : 'N'; if ($enableCloseDateSync && $isFinalStage && $isStageChanged) { $arFields['CLOSEDATE'] = $now; $arFields['~CLOSEDATE'] = $DB->CharToDateFunction($now, 'SHORT', false); } elseif (isset($arFields['CLOSEDATE']) && $arFields['CLOSEDATE'] !== '') { $arFields['~CLOSEDATE'] = $DB->CharToDateFunction($arFields['CLOSEDATE'], 'SHORT', false); } } elseif ($enableCloseDateSync && self::GetStageSemantics($arRow['STAGE_ID']) !== 'process' && isset($arFields['CLOSEDATE'])) { unset($arFields['CLOSEDATE']); } if (isset($arFields['BEGINDATE']) && $arFields['BEGINDATE'] !== '') { $arFields['~BEGINDATE'] = $DB->CharToDateFunction($arFields['BEGINDATE'], 'SHORT', false); } if (isset($arFields['BEGINDATE'])) { $arFields['__BEGINDATE'] = $arFields['BEGINDATE']; unset($arFields['BEGINDATE']); } if (isset($arFields['CLOSEDATE'])) { $arFields['__CLOSEDATE'] = $arFields['CLOSEDATE']; unset($arFields['CLOSEDATE']); } unset($arFields['ID']); $sUpdate = $DB->PrepareUpdate('b_crm_deal', $arFields); if (strlen($sUpdate) > 0) { $DB->Query("UPDATE b_crm_deal SET {$sUpdate} WHERE ID = {$ID}", false, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); $bResult = true; } //Restore BEGINDATE and CLOSEDATE if (isset($arFields['__BEGINDATE'])) { $arFields['BEGINDATE'] = $arFields['__BEGINDATE']; unset($arFields['__BEGINDATE']); } if (isset($arFields['__CLOSEDATE'])) { $arFields['CLOSEDATE'] = $arFields['__CLOSEDATE']; unset($arFields['__CLOSEDATE']); } if (defined("BX_COMP_MANAGED_CACHE")) { static $arNameFields = array("TITLE"); $bClear = false; foreach ($arNameFields as $val) { if (isset($arFields[$val])) { $bClear = true; break; } } if ($bClear) { $GLOBALS["CACHE_MANAGER"]->ClearByTag("crm_entity_name_" . CCrmOwnerType::Deal . "_" . $ID); } } CCrmPerms::UpdateEntityAttr('DEAL', $ID, $arEntityAttr); CCrmEntityHelper::NormalizeUserFields($arFields, self::$sUFEntityID, $GLOBALS['USER_FIELD_MANAGER'], array('IS_NEW' => false)); $GLOBALS['USER_FIELD_MANAGER']->Update(self::$sUFEntityID, $ID, $arFields); //Statistics & History --> $currentDbResult = \CCrmDeal::GetListEx(array(), array('=ID' => $ID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('*', 'UF_*')); $currentFields = $currentDbResult->Fetch(); Bitrix\Crm\Statistics\DealSumStatisticEntry::register($ID, $currentFields); Bitrix\Crm\History\DealStageHistoryEntry::synchronize($ID, $currentFields); Bitrix\Crm\Statistics\DealInvoiceStatisticEntry::synchronize($ID, $currentFields); Bitrix\Crm\Statistics\DealActivityStatisticEntry::synchronize($ID, $currentFields); if (isset($arFields['STAGE_ID'])) { Bitrix\Crm\History\DealStageHistoryEntry::register($ID, $arFields, array('IS_NEW' => false)); } //<-- Statistics & History if ($bUpdateSearch) { $arFilterTmp = array('ID' => $ID); if (!$this->bCheckPermission) { $arFilterTmp['CHECK_PERMISSIONS'] = 'N'; } CCrmSearch::UpdateSearch($arFilterTmp, 'DEAL', true); } $arFields['ID'] = $ID; if (isset($arFields['FM']) && is_array($arFields['FM'])) { $CCrmFieldMulti = new CCrmFieldMulti(); $CCrmFieldMulti->SetFields('DEAL', $ID, $arFields['FM']); } // Responsible user sync //CCrmActivity::Synchronize(CCrmOwnerType::Deal, $ID); $registerSonetEvent = isset($options['REGISTER_SONET_EVENT']) && $options['REGISTER_SONET_EVENT'] === true; if ($bResult && isset($arFields['ASSIGNED_BY_ID'])) { CCrmSonetSubscription::ReplaceSubscriptionByEntity(CCrmOwnerType::Deal, $ID, CCrmSonetSubscriptionType::Responsibility, $arFields['ASSIGNED_BY_ID'], $arRow['ASSIGNED_BY_ID'], $registerSonetEvent); } if ($bResult && $bCompare && $registerSonetEvent && !empty($sonetEventData)) { //CONTACT $newContactID = isset($arFields['CONTACT_ID']) ? intval($arFields['CONTACT_ID']) : 0; $oldContactID = isset($arRow['CONTACT_ID']) ? intval($arRow['CONTACT_ID']) : 0; $contactID = $newContactID > 0 ? $newContactID : $oldContactID; //COMPANY $newCompanyID = isset($arFields['COMPANY_ID']) ? intval($arFields['COMPANY_ID']) : 0; $oldCompanyID = isset($arRow['COMPANY_ID']) ? intval($arRow['COMPANY_ID']) : 0; $companyID = $newCompanyID > 0 ? $newCompanyID : $oldCompanyID; $modifiedByID = intval($arFields['MODIFY_BY_ID']); foreach ($sonetEventData as &$sonetEvent) { $sonetEventType = $sonetEvent['TYPE']; $sonetEventCode = isset($sonetEvent['CODE']) ? $sonetEvent['CODE'] : ''; $sonetEventFields =& $sonetEvent['FIELDS']; $sonetEventFields['ENTITY_TYPE_ID'] = CCrmOwnerType::Deal; $sonetEventFields['ENTITY_ID'] = $ID; $sonetEventFields['USER_ID'] = $modifiedByID; //Register contact & company relations if ($sonetEventCode === 'CLIENT') { $sonetEventFields['PARENTS'] = array(); //If contact changed bind events to old and new contacts if ($oldContactID !== $newContactID) { if ($oldContactID > 0) { $sonetEventFields['PARENTS'][] = array('ENTITY_TYPE_ID' => CCrmOwnerType::Contact, 'ENTITY_ID' => $oldContactID); } if ($newContactID > 0) { $sonetEventFields['PARENTS'][] = array('ENTITY_TYPE_ID' => CCrmOwnerType::Contact, 'ENTITY_ID' => $newContactID); } } //If company changed bind events to old and new companies if ($oldCompanyID !== $newCompanyID) { if ($oldCompanyID > 0) { $sonetEventFields['PARENTS'][] = array('ENTITY_TYPE_ID' => CCrmOwnerType::Company, 'ENTITY_ID' => $oldCompanyID); } if ($newCompanyID > 0) { $sonetEventFields['PARENTS'][] = array('ENTITY_TYPE_ID' => CCrmOwnerType::Company, 'ENTITY_ID' => $newCompanyID); } } } elseif ($contactID > 0 || $companyID > 0) { $sonetEventFields['PARENTS'] = array(); if ($contactID > 0) { $sonetEventFields['PARENTS'][] = array('ENTITY_TYPE_ID' => CCrmOwnerType::Contact, 'ENTITY_ID' => $contactID); } if ($companyID > 0) { $sonetEventFields['PARENTS'][] = array('ENTITY_TYPE_ID' => CCrmOwnerType::Company, 'ENTITY_ID' => $companyID); } } $logEventID = CCrmLiveFeed::CreateLogEvent($sonetEventFields, $sonetEventType); if ($logEventID && CModule::IncludeModule("im")) { $url = CCrmOwnerType::GetShowUrl(CCrmOwnerType::Deal, $ID); $serverName = (CMain::IsHTTPS() ? "https" : "http") . "://" . (defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME) > 0 ? SITE_SERVER_NAME : COption::GetOptionString("main", "server_name", "")); if ($sonetEvent['TYPE'] == CCrmLiveFeedEvent::Responsible && $sonetEventFields['PARAMS']['FINAL_RESPONSIBLE_ID'] != $modifiedByID) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $sonetEventFields['PARAMS']['FINAL_RESPONSIBLE_ID'], "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "deal_update", "NOTIFY_TAG" => "CRM|DEAL_RESPONSIBLE|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_DEAL_RESPONSIBLE_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['TITLE']) . "</a>")), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_DEAL_RESPONSIBLE_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['TITLE']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } if ($sonetEvent['TYPE'] == CCrmLiveFeedEvent::Responsible && $sonetEventFields['PARAMS']['START_RESPONSIBLE_ID'] != $modifiedByID) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $sonetEventFields['PARAMS']['START_RESPONSIBLE_ID'], "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "deal_update", "NOTIFY_TAG" => "CRM|DEAL_RESPONSIBLE|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_DEAL_NOT_RESPONSIBLE_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['TITLE']) . "</a>")), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_DEAL_NOT_RESPONSIBLE_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['TITLE']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } if ($sonetEvent['TYPE'] == CCrmLiveFeedEvent::Progress && $sonetEventFields['PARAMS']['START_STATUS_ID'] && $sonetEventFields['PARAMS']['FINAL_STATUS_ID']) { $assignedByID = isset($arFields['ASSIGNED_BY_ID']) ? $arFields['ASSIGNED_BY_ID'] : $arRow['ASSIGNED_BY_ID']; $infos = CCrmStatus::GetStatus('DEAL_STAGE'); if ($assignedByID != $modifiedByID && array_key_exists($sonetEventFields['PARAMS']['START_STATUS_ID'], $infos) && array_key_exists($sonetEventFields['PARAMS']['FINAL_STATUS_ID'], $infos)) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $assignedByID, "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "deal_update", "NOTIFY_TAG" => "CRM|DEAL_PROGRESS|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_DEAL_PROGRESS_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['TITLE']) . "</a>", "#start_status_title#" => htmlspecialcharsbx($infos[$sonetEventFields['PARAMS']['START_STATUS_ID']]['NAME']), "#final_status_title#" => htmlspecialcharsbx($infos[$sonetEventFields['PARAMS']['FINAL_STATUS_ID']]['NAME']))), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_DEAL_PROGRESS_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['TITLE']), "#start_status_title#" => htmlspecialcharsbx($infos[$sonetEventFields['PARAMS']['START_STATUS_ID']]['NAME']), "#final_status_title#" => htmlspecialcharsbx($infos[$sonetEventFields['PARAMS']['FINAL_STATUS_ID']]['NAME']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } } } unset($sonetEventFields); } unset($sonetEvent); } if ($bResult) { $afterEvents = GetModuleEvents('crm', 'OnAfterCrmDealUpdate'); while ($arEvent = $afterEvents->Fetch()) { ExecuteModuleEventEx($arEvent, array(&$arFields)); } } self::PullChange('UPDATE', array('ID' => $ID)); } return $bResult; }
public function Update($ID, &$arFields, $bCompare = true, $bUpdateSearch = true, $options = array()) { global $DB; $this->LAST_ERROR = ''; $ID = (int) $ID; if (!is_array($options)) { $options = array(); } $arFilterTmp = array('ID' => $ID); if (!$this->bCheckPermission) { $arFilterTmp['CHECK_PERMISSIONS'] = 'N'; } $obRes = self::GetList(array(), $arFilterTmp); if (!($arRow = $obRes->Fetch())) { return false; } $iUserId = CCrmSecurityHelper::GetCurrentUserID(); if (isset($arFields['DATE_CREATE'])) { unset($arFields['DATE_CREATE']); } if (isset($arFields['DATE_MODIFY'])) { unset($arFields['DATE_MODIFY']); } $arFields['~DATE_MODIFY'] = $DB->CurrentTimeFunction(); if (!isset($arFields['MODIFY_BY_ID']) || $arFields['MODIFY_BY_ID'] <= 0) { $arFields['MODIFY_BY_ID'] = $iUserId; } if (isset($arFields['ASSIGNED_BY_ID']) && $arFields['ASSIGNED_BY_ID'] <= 0) { unset($arFields['ASSIGNED_BY_ID']); } // number if (!isset($arFields['QUOTE_NUMBER']) || empty($arFields['QUOTE_NUMBER'])) { $arFields['QUOTE_NUMBER'] = isset($arRow['QUOTE_NUMBER']) ? $arRow['QUOTE_NUMBER'] : ''; if (empty($arFields['QUOTE_NUMBER'])) { $arFields['QUOTE_NUMBER'] = strval($ID); } } // person type if (!isset($arFields['PERSON_TYPE_ID']) || intval($arFields['PERSON_TYPE_ID']) <= 0) { $companyId = isset($arFields['COMPANY_ID']) ? intval($arFields['COMPANY_ID']) : (isset($arRow['COMPANY_ID']) ? intval($arRow['COMPANY_ID']) : 0); $arFields['PERSON_TYPE_ID'] = intval($arRow['PERSON_TYPE_ID']); $arPersonTypes = CCrmPaySystem::getPersonTypeIDs(); if (isset($arPersonTypes['CONTACT']) && isset($arPersonTypes['COMPANY'])) { if ($companyId <= 0) { $arFields['PERSON_TYPE_ID'] = intval($arPersonTypes['CONTACT']); } else { $arFields['PERSON_TYPE_ID'] = intval($arPersonTypes['COMPANY']); } } unset($companyId, $arPersonTypes); } // storage type id $storageTypeID = isset($arFields['STORAGE_TYPE_ID']) ? intval($arFields['STORAGE_TYPE_ID']) : CCrmQuoteStorageType::Undefined; if ($storageTypeID === CCrmQuoteStorageType::Undefined || !CCrmQuoteStorageType::IsDefined($storageTypeID)) { $storageTypeID = isset($arRow['STORAGE_TYPE_ID']) ? $arRow['STORAGE_TYPE_ID'] : CCrmQuoteStorageType::Undefined; if ($storageTypeID === CCrmQuoteStorageType::Undefined || !CCrmQuoteStorageType::IsDefined($storageTypeID)) { $storageTypeID = CCrmQuote::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); } $assignedByID = (int) (isset($arFields['ASSIGNED_BY_ID']) ? $arFields['ASSIGNED_BY_ID'] : $arRow['ASSIGNED_BY_ID']); $bResult = false; if (!$this->CheckFields($arFields, $ID, $options)) { $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } else { if ($this->bCheckPermission && !CCrmAuthorizationHelper::CheckUpdatePermission(self::$TYPE_NAME, $ID, $this->cPerms)) { $this->LAST_ERROR = GetMessage('CRM_PERMISSION_DENIED'); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; return false; } $arAttr = array(); $arAttr['STATUS_ID'] = !empty($arFields['STATUS_ID']) ? $arFields['STATUS_ID'] : $arRow['STATUS_ID']; $arAttr['OPENED'] = !empty($arFields['OPENED']) ? $arFields['OPENED'] : $arRow['OPENED']; $arEntityAttr = self::BuildEntityAttr($assignedByID, $arAttr); $sEntityPerm = $this->cPerms->GetPermType('QUOTE', 'WRITE', $arEntityAttr); $this->PrepareEntityAttrs($arEntityAttr, $sEntityPerm); //Prevent 'OPENED' field change by user restricted by BX_CRM_PERM_OPEN permission if ($sEntityPerm === BX_CRM_PERM_OPEN && isset($arFields['OPENED']) && $arFields['OPENED'] !== 'Y' && $assignedByID !== $iUserId) { $arFields['OPENED'] = 'Y'; } if (isset($arFields['ASSIGNED_BY_ID']) && $arRow['ASSIGNED_BY_ID'] != $arFields['ASSIGNED_BY_ID']) { CCrmEvent::SetAssignedByElement($arFields['ASSIGNED_BY_ID'], 'QUOTE', $ID); } if ($bCompare) { $arEvents = self::CompareFields($arRow, $arFields, $this->bCheckPermission); foreach ($arEvents as $arEvent) { $arEvent['ENTITY_TYPE'] = 'QUOTE'; $arEvent['ENTITY_ID'] = $ID; $arEvent['EVENT_TYPE'] = 1; if (!isset($arEvent['USER_ID'])) { $arEvent['USER_ID'] = $iUserId; } $CCrmEvent = new CCrmEvent(); $eventID = $CCrmEvent->Add($arEvent, $this->bCheckPermission); } } // Calculation of Account Data $accData = CCrmAccountingHelper::PrepareAccountingData(array('CURRENCY_ID' => isset($arFields['CURRENCY_ID']) ? $arFields['CURRENCY_ID'] : (isset($arRow['CURRENCY_ID']) ? $arRow['CURRENCY_ID'] : null), 'SUM' => isset($arFields['OPPORTUNITY']) ? $arFields['OPPORTUNITY'] : (isset($arRow['OPPORTUNITY']) ? $arRow['OPPORTUNITY'] : null), 'EXCH_RATE' => isset($arFields['EXCH_RATE']) ? $arFields['EXCH_RATE'] : (isset($arRow['EXCH_RATE']) ? $arRow['EXCH_RATE'] : null))); if (is_array($accData)) { $arFields['ACCOUNT_CURRENCY_ID'] = $accData['ACCOUNT_CURRENCY_ID']; $arFields['OPPORTUNITY_ACCOUNT'] = $accData['ACCOUNT_SUM']; } $accData = CCrmAccountingHelper::PrepareAccountingData(array('CURRENCY_ID' => isset($arFields['CURRENCY_ID']) ? $arFields['CURRENCY_ID'] : (isset($arRow['CURRENCY_ID']) ? $arRow['CURRENCY_ID'] : null), 'SUM' => isset($arFields['TAX_VALUE']) ? $arFields['TAX_VALUE'] : (isset($arRow['TAX_VALUE']) ? $arRow['TAX_VALUE'] : null), 'EXCH_RATE' => isset($arFields['EXCH_RATE']) ? $arFields['EXCH_RATE'] : (isset($arRow['EXCH_RATE']) ? $arRow['EXCH_RATE'] : null))); if (is_array($accData)) { $arFields['TAX_VALUE_ACCOUNT'] = $accData['ACCOUNT_SUM']; } if (isset($arFields['STATUS_ID'])) { $arFields['CLOSED'] = self::GetStatusSemantics($arFields['STATUS_ID']) === 'process' ? 'N' : 'Y'; } if (isset($arFields['BEGINDATE']) && !isset($arFields['BEGINDATE'][0])) { unset($arFields['BEGINDATE']); } if (isset($arFields['CLOSED']) && $arFields['CLOSED'] === 'Y' && (!isset($arFields['CLOSEDATE']) || $arFields['CLOSEDATE'] === '')) { $arFields['CLOSEDATE'] = ConvertTimeStamp(time() + CTimeZone::GetOffset(), 'FULL', SITE_ID); } if (!isset($arFields['ID'])) { $arFields['ID'] = $ID; } foreach (GetModuleEvents('crm', 'OnBeforeCrmQuoteUpdate', 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_UPDATE_CANCELED', array('#NAME#' => $arEvent['TO_NAME'])); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } return false; } } unset($arFields['ID']); $sUpdate = $DB->PrepareUpdate('b_crm_quote', $arFields); if (strlen($sUpdate) > 0) { $clobFieldNames = array('COMMENTS', 'CONTENT', 'STORAGE_ELEMENT_IDS'); $arBinds = array(); foreach ($clobFieldNames as $fieldName) { if (array_key_exists($fieldName, $arFields)) { $arBinds[$fieldName] = $arFields[$fieldName]; } } unset($fieldName); $sql = "UPDATE b_crm_quote SET {$sUpdate} WHERE ID = {$ID}"; if (!empty($arBinds)) { $DB->QueryBind($sql, $arBinds, false); } else { $DB->Query($sql, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__); } $bResult = true; } if (defined("BX_COMP_MANAGED_CACHE")) { static $arNameFields = array("TITLE"); $bClear = false; foreach ($arNameFields as $val) { if (isset($arFields[$val])) { $bClear = true; break; } } if ($bClear) { $GLOBALS["CACHE_MANAGER"]->ClearByTag("crm_entity_name_" . CCrmOwnerType::Quote . "_" . $ID); } } CCrmPerms::UpdateEntityAttr('QUOTE', $ID, $arEntityAttr); CCrmEntityHelper::NormalizeUserFields($arFields, self::$sUFEntityID, $GLOBALS['USER_FIELD_MANAGER'], array('IS_NEW' => false)); $GLOBALS['USER_FIELD_MANAGER']->Update(self::$sUFEntityID, $ID, $arFields); if (is_array($storageElementIDs)) { CCrmQuote::DoSaveElementIDs($ID, $storageTypeID, $storageElementIDs); } unset($storageTypeID, $storageElementIDs); if ($bUpdateSearch) { $arFilterTmp = array('ID' => $ID); if (!$this->bCheckPermission) { $arFilterTmp["CHECK_PERMISSIONS"] = "N"; } CCrmSearch::UpdateSearch($arFilterTmp, 'QUOTE', true); } $arFields['ID'] = $ID; if (isset($arFields['FM']) && is_array($arFields['FM'])) { $CCrmFieldMulti = new CCrmFieldMulti(); $CCrmFieldMulti->SetFields('QUOTE', $ID, $arFields['FM']); } // Responsible user sync //CCrmActivity::Synchronize(CCrmOwnerType::Quote, $ID); if ($bResult) { foreach (GetModuleEvents('crm', 'OnAfterCrmQuoteUpdate', true) as $arEvent) { ExecuteModuleEventEx($arEvent, array(&$arFields)); } } } return $bResult; }
public function Update($ID, array &$arFields, $bCompare = true, $bUpdateSearch = true, $arOptions = array()) { global $DB; $this->LAST_ERROR = ''; $ID = (int) $ID; if (!is_array($arOptions)) { $arOptions = array(); } $arFilterTmp = array('ID' => $ID); if (!$this->bCheckPermission) { $arFilterTmp['CHECK_PERMISSIONS'] = 'N'; } $obRes = self::GetListEx(array(), $arFilterTmp); if (!($arRow = $obRes->Fetch())) { return false; } $iUserId = CCrmSecurityHelper::GetCurrentUserID(); if (isset($arFields['DATE_CREATE'])) { unset($arFields['DATE_CREATE']); } if (isset($arFields['DATE_MODIFY'])) { unset($arFields['DATE_MODIFY']); } $arFields['~DATE_MODIFY'] = $DB->CurrentTimeFunction(); if (isset($arFields['DATE_CLOSED'])) { unset($arFields['DATE_CLOSED']); } if (!empty($arFields['STATUS_ID']) && $arFields['STATUS_ID'] !== $arRow['STATUS_ID']) { self::EnsureStatusesLoaded(); if (in_array($arFields['STATUS_ID'], self::$LEAD_STATUSES_BY_GROUP['FINISHED'])) { $arFields['~DATE_CLOSED'] = $DB->CurrentTimeFunction(); } } if (!isset($arFields['MODIFY_BY_ID']) || $arFields['MODIFY_BY_ID'] <= 0) { $arFields['MODIFY_BY_ID'] = $iUserId; } if (isset($arFields['ASSIGNED_BY_ID']) && $arFields['ASSIGNED_BY_ID'] <= 0) { unset($arFields['ASSIGNED_BY_ID']); } $assignedByID = (int) (isset($arFields['ASSIGNED_BY_ID']) ? $arFields['ASSIGNED_BY_ID'] : $arRow['ASSIGNED_BY_ID']); $bResult = false; if (!$this->CheckFields($arFields, $ID, $arOptions)) { $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } else { if ($this->bCheckPermission && !CCrmAuthorizationHelper::CheckUpdatePermission(self::$TYPE_NAME, $ID, $this->cPerms)) { $this->LAST_ERROR = GetMessage('CRM_PERMISSION_DENIED'); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; return false; } $beforeEvents = GetModuleEvents('crm', 'OnBeforeCrmLeadUpdate'); while ($arEvent = $beforeEvents->Fetch()) { if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false) { if (isset($arFields['RESULT_MESSAGE'])) { $this->LAST_ERROR = $arFields['RESULT_MESSAGE']; } else { $this->LAST_ERROR = GetMessage('CRM_LEAD_UPDATE_CANCELED', array('#NAME#' => $arEvent['TO_NAME'])); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } return false; } } $arAttr = array(); $arAttr['STATUS_ID'] = !empty($arFields['STATUS_ID']) ? $arFields['STATUS_ID'] : $arRow['STATUS_ID']; $arAttr['OPENED'] = !empty($arFields['OPENED']) ? $arFields['OPENED'] : $arRow['OPENED']; $arEntityAttr = self::BuildEntityAttr($assignedByID, $arAttr); $sEntityPerm = $this->cPerms->GetPermType('LEAD', 'WRITE', $arEntityAttr); $this->PrepareEntityAttrs($arEntityAttr, $sEntityPerm); //Prevent 'OPENED' field change by user restricted by BX_CRM_PERM_OPEN permission if ($sEntityPerm === BX_CRM_PERM_OPEN && isset($arFields['OPENED']) && $arFields['OPENED'] !== 'Y' && $assignedByID !== $iUserId) { $arFields['OPENED'] = 'Y'; } if (isset($arFields['ASSIGNED_BY_ID']) && $arRow['ASSIGNED_BY_ID'] != $arFields['ASSIGNED_BY_ID']) { CCrmEvent::SetAssignedByElement($arFields['ASSIGNED_BY_ID'], 'LEAD', $ID); } $sonetEventData = array(); if ($bCompare) { $res = CCrmFieldMulti::GetList(array('ID' => 'asc'), array('ENTITY_ID' => 'LEAD', 'ELEMENT_ID' => $ID)); $arRow['FM'] = array(); while ($ar = $res->Fetch()) { $arRow['FM'][$ar['TYPE_ID']][$ar['ID']] = array('VALUE' => $ar['VALUE'], 'VALUE_TYPE' => $ar['VALUE_TYPE']); } $arEvents = self::CompareFields($arRow, $arFields); foreach ($arEvents as $arEvent) { $arEvent['ENTITY_TYPE'] = 'LEAD'; $arEvent['ENTITY_ID'] = $ID; $arEvent['EVENT_TYPE'] = 1; $CCrmEvent = new CCrmEvent(); $eventID = $CCrmEvent->Add($arEvent); if (is_int($eventID) && $eventID > 0) { $fieldID = isset($arEvent['ENTITY_FIELD']) ? $arEvent['ENTITY_FIELD'] : ''; if ($fieldID === '') { continue; } switch ($fieldID) { case 'STATUS_ID': $sonetEventData[] = array('TYPE' => CCrmLiveFeedEvent::Progress, 'FIELDS' => array('TITLE' => GetMessage('CRM_LEAD_EVENT_UPDATE_STATUS'), 'MESSAGE' => '', 'PARAMS' => array('START_STATUS_ID' => $arRow['STATUS_ID'], 'FINAL_STATUS_ID' => $arFields['STATUS_ID']))); break; case 'ASSIGNED_BY_ID': $sonetEventData[] = array('TYPE' => CCrmLiveFeedEvent::Responsible, 'FIELDS' => array('TITLE' => GetMessage('CRM_LEAD_EVENT_UPDATE_ASSIGNED_BY'), 'MESSAGE' => '', 'PARAMS' => array('START_RESPONSIBLE_ID' => $arRow['ASSIGNED_BY_ID'], 'FINAL_RESPONSIBLE_ID' => $arFields['ASSIGNED_BY_ID']))); break; case 'TITLE': $sonetEventData[] = array('TYPE' => CCrmLiveFeedEvent::Denomination, 'FIELDS' => array('TITLE' => GetMessage('CRM_LEAD_EVENT_UPDATE_TITLE'), 'MESSAGE' => '', 'PARAMS' => array('START_TITLE' => $arRow['TITLE'], 'FINAL_TITLE' => $arFields['TITLE']))); break; } } } } if (isset($arFields['BIRTHDAY_SORT'])) { unset($arFields['BIRTHDAY_SORT']); } if (isset($arFields['BIRTHDATE'])) { if ($arFields['BIRTHDATE'] !== '') { $birthDate = $arFields['BIRTHDATE']; $arFields['~BIRTHDATE'] = $DB->CharToDateFunction($birthDate, 'SHORT', false); $arFields['BIRTHDAY_SORT'] = \Bitrix\Crm\BirthdayReminder::prepareSorting($birthDate); unset($arFields['BIRTHDATE']); } else { $arFields['BIRTHDAY_SORT'] = \Bitrix\Crm\BirthdayReminder::prepareSorting(''); } } // Calculation of Account Data $accData = CCrmAccountingHelper::PrepareAccountingData(array('CURRENCY_ID' => isset($arFields['CURRENCY_ID']) ? $arFields['CURRENCY_ID'] : (isset($arRow['CURRENCY_ID']) ? $arRow['CURRENCY_ID'] : null), 'SUM' => isset($arFields['OPPORTUNITY']) ? $arFields['OPPORTUNITY'] : (isset($arRow['OPPORTUNITY']) ? $arRow['OPPORTUNITY'] : null), 'EXCH_RATE' => isset($arFields['EXCH_RATE']) ? $arFields['EXCH_RATE'] : (isset($arRow['EXCH_RATE']) ? $arRow['EXCH_RATE'] : null))); if (is_array($accData)) { $arFields['ACCOUNT_CURRENCY_ID'] = $accData['ACCOUNT_CURRENCY_ID']; $arFields['OPPORTUNITY_ACCOUNT'] = $accData['ACCOUNT_SUM']; } unset($arFields['ID']); if (isset($arFields['NAME']) && isset($arFields['LAST_NAME'])) { $arFields['FULL_NAME'] = trim($arFields['NAME'] . ' ' . $arFields['LAST_NAME']); } else { $dbRes = $DB->Query("SELECT NAME, LAST_NAME FROM b_crm_lead WHERE ID = {$ID}", false, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); $arRes = $dbRes->Fetch(); $arFields['FULL_NAME'] = trim((isset($arFields['NAME']) ? $arFields['NAME'] : $arRes['NAME']) . ' ' . (isset($arFields['LAST_NAME']) ? $arFields['LAST_NAME'] : $arRes['LAST_NAME'])); } $sUpdate = $DB->PrepareUpdate('b_crm_lead', $arFields, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); if (strlen($sUpdate) > 0) { $DB->Query("UPDATE b_crm_lead SET {$sUpdate} WHERE ID = {$ID}", false, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); if (isset($arFields['COMPANY_TITLE'])) { $newCompanyTitle = $arFields['COMPANY_TITLE']; $oldCompanyTitle = isset($arRow['COMPANY_TITLE']) ? $arRow['COMPANY_TITLE'] : ''; if ($newCompanyTitle !== $oldCompanyTitle) { \Bitrix\Crm\Integrity\DuplicateOrganizationCriterion::register(CCrmOwnerType::Lead, $ID, $newCompanyTitle); } } if (isset($arFields['LAST_NAME']) || isset($arFields['NAME']) || isset($arFields['SECOND_NAME'])) { $lastName = isset($arFields['LAST_NAME']) ? $arFields['LAST_NAME'] : (isset($arRow['LAST_NAME']) ? $arRow['LAST_NAME'] : ''); $name = isset($arFields['NAME']) ? $arFields['NAME'] : (isset($arRow['NAME']) ? $arRow['NAME'] : ''); $secondName = isset($arFields['SECOND_NAME']) ? $arFields['SECOND_NAME'] : (isset($arRow['SECOND_NAME']) ? $arRow['SECOND_NAME'] : ''); \Bitrix\Crm\Integrity\DuplicatePersonCriterion::register(CCrmOwnerType::Lead, $ID, $lastName, $name, $secondName); } $bResult = true; } if (defined("BX_COMP_MANAGED_CACHE")) { static $arNameFields = array("TITLE"); $bClear = false; foreach ($arNameFields as $val) { if (isset($arFields[$val])) { $bClear = true; break; } } if ($bClear) { $GLOBALS["CACHE_MANAGER"]->ClearByTag("crm_entity_name_" . CCrmOwnerType::Lead . "_" . $ID); } } CCrmPerms::UpdateEntityAttr('LEAD', $ID, $arEntityAttr); if (isset($arFields['ADDRESS']) || isset($arFields['ADDRESS_2']) || isset($arFields['ADDRESS_CITY']) || isset($arFields['ADDRESS_POSTAL_CODE']) || isset($arFields['ADDRESS_REGION']) || isset($arFields['ADDRESS_PROVINCE']) || isset($arFields['ADDRESS_COUNTRY'])) { \Bitrix\Crm\EntityAddress::register(CCrmOwnerType::Lead, $ID, \Bitrix\Crm\EntityAddress::Primary, array('ADDRESS_1' => isset($arFields['ADDRESS']) ? $arFields['ADDRESS'] : (isset($arRow['ADDRESS']) ? $arRow['ADDRESS'] : null), 'ADDRESS_2' => isset($arFields['ADDRESS_2']) ? $arFields['ADDRESS_2'] : (isset($arRow['ADDRESS_2']) ? $arRow['ADDRESS_2'] : null), 'CITY' => isset($arFields['ADDRESS_CITY']) ? $arFields['ADDRESS_CITY'] : (isset($arRow['ADDRESS_CITY']) ? $arRow['ADDRESS_CITY'] : null), 'POSTAL_CODE' => isset($arFields['ADDRESS_POSTAL_CODE']) ? $arFields['ADDRESS_POSTAL_CODE'] : (isset($arRow['ADDRESS_POSTAL_CODE']) ? $arRow['ADDRESS_POSTAL_CODE'] : null), 'REGION' => isset($arFields['ADDRESS_REGION']) ? $arFields['ADDRESS_REGION'] : (isset($arRow['ADDRESS_REGION']) ? $arRow['ADDRESS_REGION'] : null), 'PROVINCE' => isset($arFields['ADDRESS_PROVINCE']) ? $arFields['ADDRESS_PROVINCE'] : (isset($arRow['ADDRESS_PROVINCE']) ? $arRow['ADDRESS_PROVINCE'] : null), 'COUNTRY' => isset($arFields['ADDRESS_COUNTRY']) ? $arFields['ADDRESS_COUNTRY'] : (isset($arRow['ADDRESS_COUNTRY']) ? $arRow['ADDRESS_COUNTRY'] : null), 'COUNTRY_CODE' => isset($arFields['ADDRESS_COUNTRY_CODE']) ? $arFields['ADDRESS_COUNTRY_CODE'] : (isset($arRow['ADDRESS_COUNTRY_CODE']) ? $arRow['ADDRESS_COUNTRY_CODE'] : null))); } CCrmEntityHelper::NormalizeUserFields($arFields, self::$sUFEntityID, $GLOBALS['USER_FIELD_MANAGER'], array('IS_NEW' => false)); $GLOBALS['USER_FIELD_MANAGER']->Update(self::$sUFEntityID, $ID, $arFields); if (isset($arFields['FM']) && is_array($arFields['FM'])) { $CCrmFieldMulti = new CCrmFieldMulti(); $CCrmFieldMulti->SetFields(CCrmOwnerType::LeadName, $ID, $arFields['FM']); $multifields = \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::prepareEntityMultifieldsValues(CCrmOwnerType::Lead, $ID); \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::register(CCrmOwnerType::Lead, $ID, 'EMAIL', \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::extractMultifieldsValues($multifields, 'EMAIL')); \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::register(CCrmOwnerType::Lead, $ID, 'PHONE', \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::extractMultifieldsValues($multifields, 'PHONE')); } \Bitrix\Crm\Integrity\DuplicateEntityRanking::registerEntityStatistics(CCrmOwnerType::Lead, $ID, array_merge($arRow, $arFields)); if ($bUpdateSearch) { CCrmSearch::UpdateSearch(array('ID' => $ID, 'CHECK_PERMISSIONS' => 'N'), 'LEAD', true); } $arFields['ID'] = $ID; // Responsible user sync //CCrmActivity::Synchronize(CCrmOwnerType::Lead, $ID); // Sonet events registration $registerSonetEvent = isset($arOptions['REGISTER_SONET_EVENT']) && $arOptions['REGISTER_SONET_EVENT'] === true; if ($bResult && isset($arFields['ASSIGNED_BY_ID'])) { CCrmSonetSubscription::ReplaceSubscriptionByEntity(CCrmOwnerType::Lead, $ID, CCrmSonetSubscriptionType::Responsibility, $arFields['ASSIGNED_BY_ID'], $arRow['ASSIGNED_BY_ID'], $registerSonetEvent); } if ($bResult && $bCompare && $registerSonetEvent && !empty($sonetEventData)) { $modifiedByID = intval($arFields['MODIFY_BY_ID']); foreach ($sonetEventData as &$sonetEvent) { $sonetEventFields =& $sonetEvent['FIELDS']; $sonetEventFields['ENTITY_TYPE_ID'] = CCrmOwnerType::Lead; $sonetEventFields['ENTITY_ID'] = $ID; $sonetEventFields['USER_ID'] = $modifiedByID; $logEventID = CCrmLiveFeed::CreateLogEvent($sonetEventFields, $sonetEvent['TYPE']); if ($logEventID && CModule::IncludeModule("im")) { $url = CCrmOwnerType::GetShowUrl(CCrmOwnerType::Lead, $ID); $serverName = (CMain::IsHTTPS() ? "https" : "http") . "://" . (defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME) > 0 ? SITE_SERVER_NAME : COption::GetOptionString("main", "server_name", "")); if ($sonetEventFields['PARAMS']['FINAL_RESPONSIBLE_ID'] != $modifiedByID && $sonetEvent['TYPE'] == CCrmLiveFeedEvent::Responsible) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $sonetEventFields['PARAMS']['FINAL_RESPONSIBLE_ID'], "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "lead_update", "NOTIFY_TAG" => "CRM|LEAD_RESPONSIBLE|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_LEAD_RESPONSIBLE_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['TITLE']) . "</a>")), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_LEAD_RESPONSIBLE_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['TITLE']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } if ($sonetEvent['TYPE'] == CCrmLiveFeedEvent::Responsible && $sonetEventFields['PARAMS']['START_RESPONSIBLE_ID'] != $modifiedByID) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $sonetEventFields['PARAMS']['START_RESPONSIBLE_ID'], "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "lead_update", "NOTIFY_TAG" => "CRM|LEAD_RESPONSIBLE|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_LEAD_NOT_RESPONSIBLE_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['TITLE']) . "</a>")), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_LEAD_NOT_RESPONSIBLE_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['TITLE']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } if ($sonetEvent['TYPE'] == CCrmLiveFeedEvent::Progress && $sonetEventFields['PARAMS']['START_STATUS_ID'] && $sonetEventFields['PARAMS']['FINAL_STATUS_ID']) { $assignedByID = isset($arFields['ASSIGNED_BY_ID']) ? $arFields['ASSIGNED_BY_ID'] : $arRow['ASSIGNED_BY_ID']; $infos = CCrmStatus::GetStatus('STATUS'); if ($assignedByID != $modifiedByID && array_key_exists($sonetEventFields['PARAMS']['START_STATUS_ID'], $infos) && array_key_exists($sonetEventFields['PARAMS']['FINAL_STATUS_ID'], $infos)) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $assignedByID, "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "lead_update", "NOTIFY_TAG" => "CRM|LEAD_PROGRESS|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_LEAD_PROGRESS_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['TITLE']) . "</a>", "#start_status_title#" => htmlspecialcharsbx($infos[$sonetEventFields['PARAMS']['START_STATUS_ID']]['NAME']), "#final_status_title#" => htmlspecialcharsbx($infos[$sonetEventFields['PARAMS']['FINAL_STATUS_ID']]['NAME']))), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_LEAD_PROGRESS_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['TITLE']), "#start_status_title#" => htmlspecialcharsbx($infos[$sonetEventFields['PARAMS']['START_STATUS_ID']]['NAME']), "#final_status_title#" => htmlspecialcharsbx($infos[$sonetEventFields['PARAMS']['FINAL_STATUS_ID']]['NAME']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } } } unset($sonetEventFields); } unset($sonetEvent); } if ($bResult) { $afterEvents = GetModuleEvents('crm', 'OnAfterCrmLeadUpdate'); while ($arEvent = $afterEvents->Fetch()) { ExecuteModuleEventEx($arEvent, array(&$arFields)); } } } return $bResult; }
} else { $maxDataTime = new DateTime('9999-12-31T23:59:59'); $maxTimestamp = $maxDataTime->format('U'); if ($maxTimestamp < $eventTimestamp) { $eventDate = ''; } } } } if ($eventDate === '') { $eventDate = ConvertTimeStamp(time() + CTimeZone::GetOffset(), 'FULL', SITE_ID); } if (!($eventDate !== '' && CheckDateTime($eventDate, FORMAT_DATETIME))) { $eventDate = ConvertTimeStamp(time() + CTimeZone::GetOffset(), 'FULL', SITE_ID); } $CCrmEvent->Add(array('ENTITY_TYPE' => $entityTypeID, 'ENTITY_ID' => $entityID, 'EVENT_ID' => $eventID, 'EVENT_TEXT_1' => $eventDesc, 'DATE_CREATE' => $eventDate, 'FILES' => $eventFiles)); switch ($entityTypeID) { case 'LEAD': if (isset($_POST['STATUS_ID'])) { $statusID = $_POST['STATUS_ID']; $dbResult = CCrmLead::GetListEx(array(), array('=ID' => $entityID), false, false, array('STATUS_ID')); $arPrevious = $dbResult ? $dbResult->Fetch() : null; if (is_array($arPrevious) && isset($arPrevious['STATUS_ID']) && $arPrevious['STATUS_ID'] !== $statusID) { $CCrmLead = new CCrmLead(); $arField = array('STATUS_ID' => $statusID); if ($CCrmLead->Update($entityID, $arField)) { $arErrors = array(); CCrmBizProcHelper::AutoStartWorkflows(CCrmOwnerType::Lead, $entityID, CCrmBizProcEventType::Edit, $arErrors); } } }
// Sending Email --> if ($posting->ChangeStatus($postingID, 'P')) { $rsAgents = CAgent::GetList(array('ID' => 'DESC'), array('MODULE_ID' => 'subscribe', 'NAME' => 'CPosting::AutoSend(' . $postingID . ',%')); if (!$rsAgents->Fetch()) { CAgent::AddAgent('CPosting::AutoSend(' . $postingID . ',true);', 'subscribe', 'N', 0); } } // Try add event to entity $CCrmEvent = new CCrmEvent(); $eventText = ''; $eventText .= GetMessage('CRM_TITLE_EMAIL_SUBJECT') . ': ' . $subject . "\n\r"; $eventText .= GetMessage('CRM_TITLE_EMAIL_FROM') . ': ' . $from . "\n\r"; $eventText .= GetMessage('CRM_TITLE_EMAIL_TO') . ': ' . implode(',', $to) . "\n\r\n\r"; $eventText .= $message; // Register event only for owner $CCrmEvent->Add(array('ENTITY' => array($ownerID => array('ENTITY_TYPE' => $ownerTypeName, 'ENTITY_ID' => $ownerID)), 'EVENT_ID' => 'MESSAGE', 'EVENT_TEXT_1' => $eventText, 'FILES' => $arRawFiles)); // <-- Sending Email $commData = array(); $communications = CCrmActivity::GetCommunications($ID); foreach ($communications as &$arComm) { CCrmActivity::PrepareCommunicationInfo($arComm); $commData[] = array('type' => $arComm['TYPE'], 'value' => $arComm['VALUE'], 'entityId' => $arComm['ENTITY_ID'], 'entityType' => CCrmOwnerType::ResolveName($arComm['ENTITY_TYPE_ID']), 'entityTitle' => $arComm['TITLE'], 'entityUrl' => CCrmOwnerType::GetShowUrl($arComm['ENTITY_TYPE_ID'], $arComm['ENTITY_ID'])); } unset($arComm); $userName = ''; if ($userID > 0) { $dbResUser = CUser::GetByID($userID); $userName = is_array($user = $dbResUser->Fetch()) ? CUser::FormatName(CSite::GetNameFormat(false), $user, true, false) : ''; } $nowStr = ConvertTimeStamp(MakeTimeStamp($now), 'FULL', $siteID); CCrmActivity::PrepareStorageElementIDs($arFields);
public function Update($ID, array &$arFields, $bCompare = true, $bUpdateSearch = true, $options = array()) { global $DB; $this->LAST_ERROR = ''; $ID = (int) $ID; if (!is_array($options)) { $options = array(); } $arFilterTmp = array('ID' => $ID); if (!$this->bCheckPermission) { $arFilterTmp['CHECK_PERMISSIONS'] = 'N'; } $obRes = self::GetListEx(array(), $arFilterTmp); if (!($arRow = $obRes->Fetch())) { return false; } $iUserId = CCrmSecurityHelper::GetCurrentUserID(); if (isset($arFields['DATE_CREATE'])) { unset($arFields['DATE_CREATE']); } if (isset($arFields['DATE_MODIFY'])) { unset($arFields['DATE_MODIFY']); } $arFields['~DATE_MODIFY'] = $DB->CurrentTimeFunction(); if (!isset($arFields['MODIFY_BY_ID']) || $arFields['MODIFY_BY_ID'] <= 0) { $arFields['MODIFY_BY_ID'] = $iUserId; } if (isset($arFields['REVENUE'])) { $arFields['REVENUE'] = floatval($arFields['REVENUE']); } if (isset($arFields['ASSIGNED_BY_ID']) && $arFields['ASSIGNED_BY_ID'] <= 0) { unset($arFields['ASSIGNED_BY_ID']); } $assignedByID = (int) (isset($arFields['ASSIGNED_BY_ID']) ? $arFields['ASSIGNED_BY_ID'] : $arRow['ASSIGNED_BY_ID']); $bResult = false; if (!$this->CheckFields($arFields, $ID, $options)) { $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } else { if ($this->bCheckPermission && !CCrmAuthorizationHelper::CheckUpdatePermission(self::$TYPE_NAME, $ID, $this->cPerms)) { $this->LAST_ERROR = GetMessage('CRM_PERMISSION_DENIED'); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; return false; } $arAttr = array(); $arAttr['OPENED'] = !empty($arFields['OPENED']) ? $arFields['OPENED'] : $arRow['OPENED']; $arEntityAttr = self::BuildEntityAttr($assignedByID, $arAttr); $sEntityPerm = $this->cPerms->GetPermType('COMPANY', 'WRITE', $arEntityAttr); $this->PrepareEntityAttrs($arEntityAttr, $sEntityPerm); //Prevent 'OPENED' field change by user restricted by BX_CRM_PERM_OPEN permission if ($sEntityPerm === BX_CRM_PERM_OPEN && isset($arFields['OPENED']) && $arFields['OPENED'] !== 'Y' && $assignedByID !== $iUserId) { $arFields['OPENED'] = 'Y'; } if (isset($arFields['LOGO']) && is_array($arFields['LOGO']) && strlen(CFile::CheckImageFile($arFields['LOGO'])) === 0) { $arFields['LOGO']['MODULE_ID'] = 'crm'; if ($arFields['LOGO_del'] == 'Y' && !empty($arRow['LOGO'])) { CFile::Delete($arRow['LOGO']); } CFile::SaveForDB($arFields, 'LOGO', 'crm'); if ($arFields['LOGO_del'] == 'Y' && !isset($arFields['LOGO'])) { $arFields['LOGO'] = ''; } } $sonetEventData = array(); if ($bCompare) { $res = CCrmFieldMulti::GetList(array('ID' => 'asc'), array('ENTITY_ID' => 'COMPANY', 'ELEMENT_ID' => $ID)); $arRow['FM'] = array(); while ($ar = $res->Fetch()) { $arRow['FM'][$ar['TYPE_ID']][$ar['ID']] = array('VALUE' => $ar['VALUE'], 'VALUE_TYPE' => $ar['VALUE_TYPE']); } $arEvents = self::CompareFields($arRow, $arFields); foreach ($arEvents as $arEvent) { $arEvent['ENTITY_TYPE'] = 'COMPANY'; $arEvent['ENTITY_ID'] = $ID; $arEvent['EVENT_TYPE'] = 1; if (!isset($arEvent['USER_ID'])) { $arEvent['USER_ID'] = $iUserId; } $CCrmEvent = new CCrmEvent(); $eventID = $CCrmEvent->Add($arEvent, $this->bCheckPermission); if (is_int($eventID) && $eventID > 0) { $fieldID = isset($arEvent['ENTITY_FIELD']) ? $arEvent['ENTITY_FIELD'] : ''; if ($fieldID === '') { continue; } switch ($fieldID) { case 'ASSIGNED_BY_ID': $sonetEventData[] = array('TYPE' => CCrmLiveFeedEvent::Responsible, 'FIELDS' => array('TITLE' => GetMessage('CRM_COMPANY_EVENT_UPDATE_ASSIGNED_BY'), 'MESSAGE' => '', 'PARAMS' => array('START_RESPONSIBLE_ID' => $arRow['ASSIGNED_BY_ID'], 'FINAL_RESPONSIBLE_ID' => $arFields['ASSIGNED_BY_ID']))); break; case 'TITLE': $sonetEventData[] = array('TYPE' => CCrmLiveFeedEvent::Denomination, 'FIELDS' => array('TITLE' => GetMessage('CRM_COMPANY_EVENT_UPDATE_TITLE'), 'MESSAGE' => '', 'PARAMS' => array('START_TITLE' => $arRow['TITLE'], 'FINAL_TITLE' => $arFields['TITLE']))); break; } } } } unset($arFields["ID"]); $beforeEvents = GetModuleEvents('crm', 'OnBeforeCrmCompanyUpdate'); while ($arEvent = $beforeEvents->Fetch()) { if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false) { if (isset($arFields['RESULT_MESSAGE'])) { $this->LAST_ERROR = $arFields['RESULT_MESSAGE']; } else { $this->LAST_ERROR = GetMessage('CRM_COMPANY_UPDATE_CANCELED', array('#NAME#' => $arEvent['TO_NAME'])); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } return false; } } $sUpdate = $DB->PrepareUpdate('b_crm_company', $arFields, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); if (strlen($sUpdate) > 0) { $DB->Query("UPDATE b_crm_company SET {$sUpdate} WHERE ID = {$ID}", false, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); $bResult = true; $newTitle = isset($arFields['TITLE']) ? $arFields['TITLE'] : ''; $oldTitle = isset($arRow['TITLE']) ? $arRow['TITLE'] : ''; if ($newTitle !== '' && $newTitle !== $oldTitle) { \Bitrix\Crm\Integrity\DuplicateOrganizationCriterion::register(CCrmOwnerType::Company, $ID, $newTitle); } } if (defined("BX_COMP_MANAGED_CACHE")) { static $arNameFields = array("TITLE"); $bClear = false; foreach ($arNameFields as $val) { if (isset($arFields[$val])) { $bClear = true; break; } } if ($bClear) { $GLOBALS["CACHE_MANAGER"]->ClearByTag("crm_entity_name_" . CCrmOwnerType::Company . "_" . $ID); } } CCrmPerms::UpdateEntityAttr('COMPANY', $ID, $arEntityAttr); CCrmEntityHelper::NormalizeUserFields($arFields, self::$sUFEntityID, $GLOBALS['USER_FIELD_MANAGER'], array('IS_NEW' => false)); $GLOBALS['USER_FIELD_MANAGER']->Update(self::$sUFEntityID, $ID, $arFields); if (isset($arFields['FM']) && is_array($arFields['FM'])) { $CCrmFieldMulti = new CCrmFieldMulti(); $CCrmFieldMulti->SetFields('COMPANY', $ID, $arFields['FM']); \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::register(CCrmOwnerType::Company, $ID, 'EMAIL', \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::extractMultifieldsValues($arFields['FM'], 'EMAIL')); \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::register(CCrmOwnerType::Company, $ID, 'PHONE', \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::extractMultifieldsValues($arFields['FM'], 'PHONE')); } \Bitrix\Crm\Integrity\DuplicateEntityRanking::registerEntityStatistics(CCrmOwnerType::Company, $ID, array_merge($arRow, $arFields)); if ($bUpdateSearch) { CCrmSearch::UpdateSearch(array('ID' => $ID, 'CHECK_PERMISSIONS' => 'N'), 'COMPANY', true); } $arFields['ID'] = $ID; if (isset($arFields['CONTACT_ID']) && is_array($arFields['CONTACT_ID'])) { if (!empty($arFields['CONTACT_ID'])) { $arCurrentContact = array(); $res = CCrmContact::GetContactByCompanyId($arFields['ID']); while ($ar = $res->Fetch()) { $arCurrentContact[] = $ar['ID']; } $arAdd = array_diff($arFields['CONTACT_ID'], $arCurrentContact); $arDelete = array_diff($arCurrentContact, $arFields['CONTACT_ID']); $CCrmContact = new CCrmContact(); $CCrmContact->UpdateCompanyId($arAdd, $arFields['ID']); $CCrmContact->UpdateCompanyId($arDelete, 0); if (isset($GLOBALS["USER"])) { if (!class_exists('CUserOptions')) { include_once $_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/classes/" . $GLOBALS['DBType'] . "/favorites.php"; } CUserOptions::SetOption("crm", "crm_contact_search", array('last_selected' => implode(',', $arAdd))); } } else { $arDelete = array(); $res = CCrmContact::GetContactByCompanyId($arFields['ID']); while ($ar = $res->Fetch()) { $arDelete[] = $ar['ID']; } $CCrmContact = new CCrmContact(); $CCrmContact->UpdateCompanyId($arDelete, 0); } } $registerSonetEvent = isset($options['REGISTER_SONET_EVENT']) && $options['REGISTER_SONET_EVENT'] === true; if ($bResult && isset($arFields['ASSIGNED_BY_ID'])) { CCrmSonetSubscription::ReplaceSubscriptionByEntity(CCrmOwnerType::Company, $ID, CCrmSonetSubscriptionType::Responsibility, $arFields['ASSIGNED_BY_ID'], $arRow['ASSIGNED_BY_ID'], $registerSonetEvent); } if ($bResult && $bCompare && $registerSonetEvent && !empty($sonetEventData)) { $modifiedByID = intval($arFields['MODIFY_BY_ID']); foreach ($sonetEventData as &$sonetEvent) { $sonetEventFields =& $sonetEvent['FIELDS']; $sonetEventFields['ENTITY_TYPE_ID'] = CCrmOwnerType::Company; $sonetEventFields['ENTITY_ID'] = $ID; $sonetEventFields['USER_ID'] = $modifiedByID; $logEventID = CCrmLiveFeed::CreateLogEvent($sonetEventFields, $sonetEvent['TYPE']); if ($logEventID && $sonetEvent['TYPE'] == CCrmLiveFeedEvent::Responsible && CModule::IncludeModule("im")) { $url = CCrmOwnerType::GetShowUrl(CCrmOwnerType::Company, $ID); $serverName = (CMain::IsHTTPS() ? "https" : "http") . "://" . (defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME) > 0 ? SITE_SERVER_NAME : COption::GetOptionString("main", "server_name", "")); if ($sonetEventFields['PARAMS']['FINAL_RESPONSIBLE_ID'] != $modifiedByID) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $sonetEventFields['PARAMS']['FINAL_RESPONSIBLE_ID'], "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "company_update", "NOTIFY_TAG" => "CRM|COMPANY_RESPONSIBLE|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_COMPANY_RESPONSIBLE_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['TITLE']) . "</a>")), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_COMPANY_RESPONSIBLE_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['TITLE']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } if ($sonetEventFields['PARAMS']['START_RESPONSIBLE_ID'] != $modifiedByID) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $sonetEventFields['PARAMS']['START_RESPONSIBLE_ID'], "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "company_update", "NOTIFY_TAG" => "CRM|COMPANY_RESPONSIBLE|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_COMPANY_NOT_RESPONSIBLE_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['TITLE']) . "</a>")), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_COMPANY_NOT_RESPONSIBLE_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['TITLE']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } } unset($sonetEventFields); } unset($sonetEvent); } if ($bResult) { $afterEvents = GetModuleEvents('crm', 'OnAfterCrmCompanyUpdate'); while ($arEvent = $afterEvents->Fetch()) { ExecuteModuleEventEx($arEvent, array(&$arFields)); } } } return $bResult; }
public function Update($ID, array &$arFields, $bCompare = true, $bUpdateSearch = true, $arOptions = array()) { global $DB; $this->LAST_ERROR = ''; $ID = (int) $ID; if (!is_array($arOptions)) { $arOptions = array(); } $arFilterTmp = array('ID' => $ID); if (!$this->bCheckPermission) { $arFilterTmp['CHECK_PERMISSIONS'] = 'N'; } $obRes = self::GetListEx(array(), $arFilterTmp); if (!($arRow = $obRes->Fetch())) { return false; } $iUserId = CCrmSecurityHelper::GetCurrentUserID(); if (isset($arFields['DATE_CREATE'])) { unset($arFields['DATE_CREATE']); } if (isset($arFields['DATE_MODIFY'])) { unset($arFields['DATE_MODIFY']); } $arFields['~DATE_MODIFY'] = $DB->CurrentTimeFunction(); if (!isset($arFields['MODIFY_BY_ID']) || $arFields['MODIFY_BY_ID'] <= 0) { $arFields['MODIFY_BY_ID'] = $iUserId; } if (isset($arFields['ASSIGNED_BY_ID']) && $arFields['ASSIGNED_BY_ID'] <= 0) { unset($arFields['ASSIGNED_BY_ID']); } $assignedByID = (int) (isset($arFields['ASSIGNED_BY_ID']) ? $arFields['ASSIGNED_BY_ID'] : $arRow['ASSIGNED_BY_ID']); $bResult = false; if (!$this->CheckFields($arFields, $ID, $arOptions)) { $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } else { if ($this->bCheckPermission && !CCrmAuthorizationHelper::CheckUpdatePermission(self::$TYPE_NAME, $ID, $this->cPerms)) { $this->LAST_ERROR = GetMessage('CRM_PERMISSION_DENIED'); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; return false; } if (!isset($arFields['ID'])) { $arFields['ID'] = $ID; } $beforeEvents = GetModuleEvents('crm', 'OnBeforeCrmContactUpdate'); while ($arEvent = $beforeEvents->Fetch()) { if (ExecuteModuleEventEx($arEvent, array(&$arFields)) === false) { if (isset($arFields['RESULT_MESSAGE'])) { $this->LAST_ERROR = $arFields['RESULT_MESSAGE']; } else { $this->LAST_ERROR = GetMessage('CRM_CONTACT_UPDATE_CANCELED', array('#NAME#' => $arEvent['TO_NAME'])); $arFields['RESULT_MESSAGE'] =& $this->LAST_ERROR; } return false; } } $arAttr = array(); $arAttr['OPENED'] = !empty($arFields['OPENED']) ? $arFields['OPENED'] : $arRow['OPENED']; $arEntityAttr = self::BuildEntityAttr($assignedByID, $arAttr); $sEntityPerm = $this->cPerms->GetPermType('CONTACT', 'WRITE', $arEntityAttr); $this->PrepareEntityAttrs($arEntityAttr, $sEntityPerm); //Prevent 'OPENED' field change by user restricted by BX_CRM_PERM_OPEN permission if ($sEntityPerm === BX_CRM_PERM_OPEN && isset($arFields['OPENED']) && $arFields['OPENED'] !== 'Y' && $assignedByID !== $iUserId) { $arFields['OPENED'] = 'Y'; } if (isset($arFields['PHOTO']) && is_array($arFields['PHOTO']) && strlen(CFile::CheckImageFile($arFields['PHOTO'])) === 0) { $arFields['PHOTO']['MODULE_ID'] = 'crm'; if ($arFields['PHOTO_del'] == 'Y' && !empty($arRow['PHOTO'])) { CFile::Delete($arRow['PHOTO']); } CFile::SaveForDB($arFields, 'PHOTO', 'crm'); if ($arFields['PHOTO_del'] == 'Y' && !isset($arFields['PHOTO'])) { $arFields['PHOTO'] = ''; } } if (isset($arFields['ASSIGNED_BY_ID']) && intval($arRow['ASSIGNED_BY_ID']) !== intval($arFields['ASSIGNED_BY_ID'])) { CcrmEvent::SetAssignedByElement($arFields['ASSIGNED_BY_ID'], 'CONTACT', $ID); } $sonetEventData = array(); if ($bCompare) { $res = CCrmFieldMulti::GetList(array('ID' => 'asc'), array('ENTITY_ID' => 'CONTACT', 'ELEMENT_ID' => $ID)); $arRow['FM'] = array(); while ($ar = $res->Fetch()) { $arRow['FM'][$ar['TYPE_ID']][$ar['ID']] = array('VALUE' => $ar['VALUE'], 'VALUE_TYPE' => $ar['VALUE_TYPE']); } $arEvents = self::CompareFields($arRow, $arFields, $arOptions); foreach ($arEvents as $arEvent) { $arEvent['ENTITY_TYPE'] = 'CONTACT'; $arEvent['ENTITY_ID'] = $ID; $arEvent['EVENT_TYPE'] = 1; if (!isset($arEvent['USER_ID'])) { $arEvent['USER_ID'] = $iUserId; } $CCrmEvent = new CCrmEvent(); $eventID = $CCrmEvent->Add($arEvent, $this->bCheckPermission); if (is_int($eventID) && $eventID > 0) { $fieldID = isset($arEvent['ENTITY_FIELD']) ? $arEvent['ENTITY_FIELD'] : ''; if ($fieldID === '') { continue; } switch ($fieldID) { case 'ASSIGNED_BY_ID': $sonetEventData[] = array('TYPE' => CCrmLiveFeedEvent::Responsible, 'FIELDS' => array('TITLE' => GetMessage('CRM_CONTACT_EVENT_UPDATE_ASSIGNED_BY'), 'MESSAGE' => '', 'PARAMS' => array('START_RESPONSIBLE_ID' => $arRow['ASSIGNED_BY_ID'], 'FINAL_RESPONSIBLE_ID' => $arFields['ASSIGNED_BY_ID']))); break; case 'COMPANY_ID': $sonetEventData[] = array('CODE' => 'COMPANY', 'TYPE' => CCrmLiveFeedEvent::Owner, 'FIELDS' => array('TITLE' => GetMessage('CRM_CONTACT_EVENT_UPDATE_COMPANY'), 'MESSAGE' => '', 'PARAMS' => array('START_OWNER_COMPANY_ID' => $arRow['COMPANY_ID'], 'FINAL_OWNER_COMPANY_ID' => $arFields['COMPANY_ID']))); break; } } } } $newName = isset($arFields['NAME']) ? $arFields['NAME'] : ''; $oldName = isset($arRow['NAME']) ? $arRow['NAME'] : ''; $newSecondName = isset($arFields['SECOND_NAME']) ? $arFields['SECOND_NAME'] : ''; $oldSecondName = isset($arRow['SECOND_NAME']) ? $arRow['SECOND_NAME'] : ''; $newLastName = isset($arFields['LAST_NAME']) ? $arFields['LAST_NAME'] : ''; $oldLastName = isset($arRow['LAST_NAME']) ? $arRow['LAST_NAME'] : ''; $newHonorific = isset($arFields['HONORIFIC']) ? $arFields['HONORIFIC'] : ''; $oldHonorific = isset($arRow['HONORIFIC']) ? $arRow['HONORIFIC'] : ''; if ($newName !== $oldName || $newSecondName !== $oldSecondName || $newLastName !== $oldLastName || $newHonorific !== $oldHonorific) { CCrmActivity::ResetEntityCommunicationSettings(CCrmOwnerType::Contact, $ID); } if (isset($arFields['BIRTHDAY_SORT'])) { unset($arFields['BIRTHDAY_SORT']); } if (isset($arFields['BIRTHDATE'])) { if ($arFields['BIRTHDATE'] !== '') { $birthDate = $arFields['BIRTHDATE']; $arFields['~BIRTHDATE'] = $DB->CharToDateFunction($birthDate, 'SHORT', false); $arFields['BIRTHDAY_SORT'] = \Bitrix\Crm\BirthdayReminder::prepareSorting($birthDate); unset($arFields['BIRTHDATE']); } else { $arFields['BIRTHDAY_SORT'] = \Bitrix\Crm\BirthdayReminder::prepareSorting(''); } } if (isset($arFields['NAME']) && isset($arFields['LAST_NAME'])) { $arFields['FULL_NAME'] = self::GetFullName($arFields); } else { $dbRes = $DB->Query("SELECT NAME, LAST_NAME FROM b_crm_contact WHERE ID = {$ID}", false, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); $arRes = $dbRes->Fetch(); if (isset($arFields['NAME'])) { $arRes['NAME'] = $arFields['NAME']; } if (isset($arFields['LAST_NAME'])) { $arRes['LAST_NAME'] = $arFields['LAST_NAME']; } $arFields['FULL_NAME'] = self::GetFullName($arRes); } if (isset($arFields['HAS_EMAIL'])) { unset($arFields['HAS_EMAIL']); } if (isset($arFields['HAS_PHONE'])) { unset($arFields['HAS_PHONE']); } unset($arFields['ID']); $sUpdate = $DB->PrepareUpdate('b_crm_contact', $arFields, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); if (strlen($sUpdate) > 0) { $bResult = true; $DB->Query("UPDATE b_crm_contact SET {$sUpdate} WHERE ID = {$ID}", false, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); if (isset($arFields['LAST_NAME']) || isset($arFields['NAME']) || isset($arFields['SECOND_NAME'])) { $lastName = isset($arFields['LAST_NAME']) ? $arFields['LAST_NAME'] : (isset($arRow['LAST_NAME']) ? $arRow['LAST_NAME'] : ''); $name = isset($arFields['NAME']) ? $arFields['NAME'] : (isset($arRow['NAME']) ? $arRow['NAME'] : ''); $secondName = isset($arFields['SECOND_NAME']) ? $arFields['SECOND_NAME'] : (isset($arRow['SECOND_NAME']) ? $arRow['SECOND_NAME'] : ''); \Bitrix\Crm\Integrity\DuplicatePersonCriterion::register(CCrmOwnerType::Contact, $ID, $lastName, $name, $secondName); } } CCrmPerms::UpdateEntityAttr('CONTACT', $ID, $arEntityAttr); if (isset($arFields['ADDRESS']) || isset($arFields['ADDRESS_2']) || isset($arFields['ADDRESS_CITY']) || isset($arFields['ADDRESS_POSTAL_CODE']) || isset($arFields['ADDRESS_REGION']) || isset($arFields['ADDRESS_PROVINCE']) || isset($arFields['ADDRESS_COUNTRY'])) { \Bitrix\Crm\EntityAddress::register(CCrmOwnerType::Contact, $ID, \Bitrix\Crm\EntityAddress::Primary, array('ADDRESS_1' => isset($arFields['ADDRESS']) ? $arFields['ADDRESS'] : (isset($arRow['ADDRESS']) ? $arRow['ADDRESS'] : null), 'ADDRESS_2' => isset($arFields['ADDRESS_2']) ? $arFields['ADDRESS_2'] : (isset($arRow['ADDRESS_2']) ? $arRow['ADDRESS_2'] : null), 'CITY' => isset($arFields['ADDRESS_CITY']) ? $arFields['ADDRESS_CITY'] : (isset($arRow['ADDRESS_CITY']) ? $arRow['ADDRESS_CITY'] : null), 'POSTAL_CODE' => isset($arFields['ADDRESS_POSTAL_CODE']) ? $arFields['ADDRESS_POSTAL_CODE'] : (isset($arRow['ADDRESS_POSTAL_CODE']) ? $arRow['ADDRESS_POSTAL_CODE'] : null), 'REGION' => isset($arFields['ADDRESS_REGION']) ? $arFields['ADDRESS_REGION'] : (isset($arRow['ADDRESS_REGION']) ? $arRow['ADDRESS_REGION'] : null), 'PROVINCE' => isset($arFields['ADDRESS_PROVINCE']) ? $arFields['ADDRESS_PROVINCE'] : (isset($arRow['ADDRESS_PROVINCE']) ? $arRow['ADDRESS_PROVINCE'] : null), 'COUNTRY' => isset($arFields['ADDRESS_COUNTRY']) ? $arFields['ADDRESS_COUNTRY'] : (isset($arRow['ADDRESS_COUNTRY']) ? $arRow['ADDRESS_COUNTRY'] : null), 'COUNTRY_CODE' => isset($arFields['ADDRESS_COUNTRY_CODE']) ? $arFields['ADDRESS_COUNTRY_CODE'] : (isset($arRow['ADDRESS_COUNTRY_CODE']) ? $arRow['ADDRESS_COUNTRY_CODE'] : null))); } CCrmEntityHelper::NormalizeUserFields($arFields, self::$sUFEntityID, $GLOBALS['USER_FIELD_MANAGER'], array('IS_NEW' => false)); $GLOBALS['USER_FIELD_MANAGER']->Update(self::$sUFEntityID, $ID, $arFields); if (defined("BX_COMP_MANAGED_CACHE")) { static $arNameFields = array("NAME", "LAST_NAME", "SECOND_NAME"); $bClear = false; foreach ($arNameFields as $val) { if (isset($arFields[$val])) { $bClear = true; break; } } if ($bClear) { $GLOBALS["CACHE_MANAGER"]->ClearByTag("crm_entity_name_" . CCrmOwnerType::Contact . "_" . $ID); } } if (isset($arFields['FM']) && is_array($arFields['FM'])) { $CCrmFieldMulti = new CCrmFieldMulti(); $CCrmFieldMulti->SetFields(CCrmOwnerType::ContactName, $ID, $arFields['FM']); $multifields = \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::prepareEntityMultifieldsValues(CCrmOwnerType::Contact, $ID); $emails = \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::extractMultifieldsValues($multifields, 'EMAIL'); \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::register(CCrmOwnerType::Contact, $ID, 'EMAIL', $emails); $phones = \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::extractMultifieldsValues($multifields, 'PHONE'); \Bitrix\Crm\Integrity\DuplicateCommunicationCriterion::register(CCrmOwnerType::Contact, $ID, 'PHONE', $phones); $hasEmail = empty($emails) ? 'N' : 'Y'; $hasPhone = empty($phones) ? 'N' : 'Y'; if ($hasEmail !== (isset($arRow['HAS_EMAIL']) ? $arRow['HAS_EMAIL'] : 'N') || $hasPhone !== (isset($arRow['HAS_PHONE']) ? $arRow['HAS_PHONE'] : 'N')) { $DB->Query("UPDATE b_crm_contact SET HAS_EMAIL = '{$hasEmail}', HAS_PHONE = '{$hasPhone}' WHERE ID = {$ID}", false, 'FILE: ' . __FILE__ . '<br /> LINE: ' . __LINE__); $arFields['HAS_EMAIL'] = $hasEmail; $arFields['HAS_PHONE'] = $hasPhone; } } \Bitrix\Crm\Integrity\DuplicateEntityRanking::registerEntityStatistics(CCrmOwnerType::Contact, $ID, array_merge($arRow, $arFields)); if ($bUpdateSearch) { CCrmSearch::UpdateSearch(array('ID' => $ID, 'CHECK_PERMISSIONS' => 'N'), 'CONTACT', true); } if (isset($GLOBALS["USER"]) && isset($arFields['COMPANY_ID']) && intval($arFields['COMPANY_ID']) > 0) { if (!class_exists('CUserOptions')) { include_once $_SERVER['DOCUMENT_ROOT'] . "/bitrix/modules/main/classes/" . $GLOBALS['DBType'] . "/favorites.php"; } CUserOptions::SetOption("crm", "crm_company_search", array('last_selected' => $arFields['COMPANY_ID'])); } $arFields['ID'] = $ID; $newCompanyID = isset($arFields['COMPANY_ID']) ? intval($arFields['COMPANY_ID']) : 0; $oldCompanyID = isset($arRow['COMPANY_ID']) ? intval($arRow['COMPANY_ID']) : 0; $companyID = $newCompanyID > 0 ? $newCompanyID : $oldCompanyID; $registerSonetEvent = isset($arOptions['REGISTER_SONET_EVENT']) && $arOptions['REGISTER_SONET_EVENT'] === true; if ($bResult && isset($arFields['ASSIGNED_BY_ID'])) { CCrmSonetSubscription::ReplaceSubscriptionByEntity(CCrmOwnerType::Contact, $ID, CCrmSonetSubscriptionType::Responsibility, $arFields['ASSIGNED_BY_ID'], $arRow['ASSIGNED_BY_ID'], $registerSonetEvent); } if ($bResult && $bCompare && $registerSonetEvent && !empty($sonetEventData)) { $modifiedByID = intval($arFields['MODIFY_BY_ID']); foreach ($sonetEventData as &$sonetEvent) { $sonetEventType = $sonetEvent['TYPE']; $sonetEventCode = isset($sonetEvent['CODE']) ? $sonetEvent['CODE'] : ''; $sonetEventFields =& $sonetEvent['FIELDS']; $sonetEventFields['ENTITY_TYPE_ID'] = CCrmOwnerType::Contact; $sonetEventFields['ENTITY_ID'] = $ID; $sonetEventFields['USER_ID'] = $modifiedByID; //Register company relation if ($sonetEventCode === 'COMPANY') { //If company changed bind events to old and new companies $sonetEventFields['PARENTS'] = array(); if ($oldCompanyID > 0) { $sonetEventFields['PARENTS'][] = array('ENTITY_TYPE_ID' => CCrmOwnerType::Company, 'ENTITY_ID' => $oldCompanyID); } if ($newCompanyID > 0) { $sonetEventFields['PARENTS'][] = array('ENTITY_TYPE_ID' => CCrmOwnerType::Company, 'ENTITY_ID' => $newCompanyID); } } elseif ($companyID > 0) { $sonetEventFields['PARENT_ENTITY_TYPE_ID'] = CCrmOwnerType::Company; $sonetEventFields['PARENT_ENTITY_ID'] = $companyID; } $logEventID = CCrmLiveFeed::CreateLogEvent($sonetEventFields, $sonetEventType); if ($logEventID && $sonetEvent['TYPE'] == CCrmLiveFeedEvent::Responsible && CModule::IncludeModule("im")) { $url = CCrmOwnerType::GetShowUrl(CCrmOwnerType::Contact, $ID); $serverName = (CMain::IsHTTPS() ? "https" : "http") . "://" . (defined("SITE_SERVER_NAME") && strlen(SITE_SERVER_NAME) > 0 ? SITE_SERVER_NAME : COption::GetOptionString("main", "server_name", "")); if ($sonetEventFields['PARAMS']['FINAL_RESPONSIBLE_ID'] != $modifiedByID) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $sonetEventFields['PARAMS']['FINAL_RESPONSIBLE_ID'], "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "contact_update", "NOTIFY_TAG" => "CRM|CONTACT_RESPONSIBLE|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_CONTACT_RESPONSIBLE_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['FULL_NAME']) . "</a>")), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_CONTACT_RESPONSIBLE_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['FULL_NAME']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } if ($sonetEventFields['PARAMS']['START_RESPONSIBLE_ID'] != $modifiedByID) { $arMessageFields = array("MESSAGE_TYPE" => IM_MESSAGE_SYSTEM, "TO_USER_ID" => $sonetEventFields['PARAMS']['START_RESPONSIBLE_ID'], "FROM_USER_ID" => $modifiedByID, "NOTIFY_TYPE" => IM_NOTIFY_FROM, "NOTIFY_MODULE" => "crm", "LOG_ID" => $logEventID, "NOTIFY_EVENT" => "contact_update", "NOTIFY_TAG" => "CRM|CONTACT_RESPONSIBLE|" . $ID, "NOTIFY_MESSAGE" => GetMessage("CRM_CONTACT_NOT_RESPONSIBLE_IM_NOTIFY", array("#title#" => "<a href=\"" . $url . "\" class=\"bx-notifier-item-action\">" . htmlspecialcharsbx($arFields['FULL_NAME']) . "</a>")), "NOTIFY_MESSAGE_OUT" => GetMessage("CRM_CONTACT_NOT_RESPONSIBLE_IM_NOTIFY", array("#title#" => htmlspecialcharsbx($arFields['FULL_NAME']))) . " (" . $serverName . $url . ")"); CIMNotify::Add($arMessageFields); } } unset($sonetEventFields); } unset($sonetEvent); } if ($bResult) { $afterEvents = GetModuleEvents('crm', 'OnAfterCrmContactUpdate'); while ($arEvent = $afterEvents->Fetch()) { ExecuteModuleEventEx($arEvent, array(&$arFields)); } } } return $bResult; }
public static function EmailMessageAdd($arMessageFields, $ACTION_VARS) { if (!CModule::IncludeModule('crm')) { return false; } $date = isset($arMessageFields['FIELD_DATE']) ? $arMessageFields['FIELD_DATE'] : ''; $maxAgeDays = intval(COption::GetOptionString('crm', 'email_max_age', 7)); $maxAge = $maxAgeDays > 0 ? $maxAgeDays * 86400 : 0; if ($maxAge > 0 && $date !== '') { $now = time() + CTimeZone::GetOffset(); $timestamp = MakeTimeStamp($date, FORMAT_DATETIME); if ($now - $timestamp > $maxAge) { //Time threshold is exceeded return false; } } $crmEmail = strtolower(trim(COption::GetOptionString('crm', 'mail', ''))); $msgID = isset($arMessageFields['ID']) ? intval($arMessageFields['ID']) : 0; $mailboxID = isset($arMessageFields['MAILBOX_ID']) ? intval($arMessageFields['MAILBOX_ID']) : 0; $from = isset($arMessageFields['FIELD_FROM']) ? $arMessageFields['FIELD_FROM'] : ''; $replyTo = isset($arMessageFields['FIELD_REPLY_TO']) ? $arMessageFields['FIELD_REPLY_TO'] : ''; if ($replyTo !== '') { // Ignore FROM if REPLY_TO EXISTS $from = $replyTo; } $addresserInfo = CCrmMailHelper::ParseEmail($from); if ($crmEmail !== '' && strcasecmp($addresserInfo['EMAIL'], $crmEmail) === 0) { // Ignore emails from ourselves return false; } $to = isset($arMessageFields['FIELD_TO']) ? $arMessageFields['FIELD_TO'] : ''; $cc = isset($arMessageFields['FIELD_CC']) ? $arMessageFields['FIELD_CC'] : ''; $bcc = isset($arMessageFields['FIELD_BCC']) ? $arMessageFields['FIELD_BCC'] : ''; $addresseeEmails = array_unique(array_merge($to !== '' ? CMailUtil::ExtractAllMailAddresses($to) : array(), $cc !== '' ? CMailUtil::ExtractAllMailAddresses($cc) : array(), $bcc !== '' ? CMailUtil::ExtractAllMailAddresses($bcc) : array()), SORT_STRING); if ($mailboxID > 0) { $dbMailbox = CMailBox::GetById($mailboxID); $arMailbox = $dbMailbox->Fetch(); // POP3 mailboxes are ignored - they bound to single email if ($arMailbox && $arMailbox['SERVER_TYPE'] === 'smtp' && (empty($crmEmail) || !in_array($crmEmail, $addresseeEmails, true))) { return false; } } $subject = isset($arMessageFields['SUBJECT']) ? $arMessageFields['SUBJECT'] : ''; $body = isset($arMessageFields['BODY']) ? $arMessageFields['BODY'] : ''; $arBodyEmails = null; $userID = 0; $parentID = 0; $ownerTypeID = CCrmOwnerType::Undefined; $ownerID = 0; $addresserID = self::FindUserIDByEmail($addresserInfo['EMAIL']); if ($addresserID > 0 && Bitrix\Crm\Integration\IntranetManager::isExternalUser($addresserID)) { //Forget about extranet user $addresserID = 0; } $arCommEmails = $addresserID <= 0 ? array($addresserInfo['EMAIL']) : ($crmEmail !== '' ? array_diff($addresseeEmails, array($crmEmail)) : $addresseeEmails); //Trying to fix strange behaviour of array_diff under OPcache (issue #60862) $arCommEmails = array_filter($arCommEmails); $targInfo = CCrmActivity::ParseUrn(CCrmActivity::ExtractUrnFromMessage($arMessageFields, CCrmEMailCodeAllocation::GetCurrent())); $targActivity = $targInfo['ID'] > 0 ? CCrmActivity::GetByID($targInfo['ID'], false) : null; // Check URN if (!$targActivity && (!isset($targActivity['URN']) || strtoupper($targActivity['URN']) !== strtoupper($targInfo['URN']))) { $targActivity = null; } if ($targActivity) { $postingID = self::ExtractPostingID($arMessageFields); if ($postingID > 0 && isset($targActivity['ASSOCIATED_ENTITY_ID']) && intval($targActivity['ASSOCIATED_ENTITY_ID']) === $postingID) { // Ignore - it is our message. return false; } $parentID = $targActivity['ID']; $subject = CCrmActivity::ClearUrn($subject); if ($addresserID > 0) { $userID = $addresserID; } elseif (isset($targActivity['RESPONSIBLE_ID'])) { $userID = $targActivity['RESPONSIBLE_ID']; } if (isset($targActivity['OWNER_TYPE_ID'])) { $ownerTypeID = intval($targActivity['OWNER_TYPE_ID']); } if (isset($targActivity['OWNER_ID'])) { $ownerID = intval($targActivity['OWNER_ID']); } $arCommData = self::ExtractCommsFromEmails($arCommEmails); if ($ownerTypeID > 0 && $ownerID > 0) { if (empty($arCommData)) { if ($addresserID > 0) { foreach ($addresseeEmails as $email) { if ($email === $crmEmail) { continue; } $arCommData = array(self::CreateComm($ownerTypeID, $ownerID, $email)); } } else { $arCommData = array(self::CreateComm($ownerTypeID, $ownerID, $addresserInfo['EMAIL'])); } } elseif ($ownerTypeID !== CCrmOwnerType::Deal) { //Check if owner in communications. Otherwise clear owner. //There is only one exception for DEAL - it entity has no communications $isOwnerInComms = false; foreach ($arCommData as &$arCommItem) { $commEntityTypeID = isset($arCommItem['ENTITY_TYPE_ID']) ? $arCommItem['ENTITY_TYPE_ID'] : CCrmOwnerType::Undefined; $commEntityID = isset($arCommItem['ENTITY_ID']) ? $arCommItem['ENTITY_ID'] : 0; if ($commEntityTypeID === $ownerTypeID && $commEntityID === $ownerID) { $isOwnerInComms = true; break; } } unset($arCommItem); if (!$isOwnerInComms) { $ownerTypeID = CCrmOwnerType::Undefined; $ownerID = 0; } } } } else { if ($addresserID > 0) { //It is email from registred user $userID = $addresserID; if (empty($arCommEmails)) { $arBodyEmails = self::ExtractEmailsFromBody($body); //Clear system user emails if (!empty($arBodyEmails)) { foreach ($arBodyEmails as $email) { if (self::FindUserIDByEmail($email) <= 0) { $arCommEmails[] = $email; } } } } // Try to resolve communications $arCommData = self::ExtractCommsFromEmails($arCommEmails); } else { //It is email from unknown user //Try to resolve bindings from addresser $arCommData = self::ExtractCommsFromEmails($arCommEmails); if (!empty($arCommData)) { // Try to resolve responsible user foreach ($arCommData as &$arComm) { $userID = self::ResolveResponsibleID($arComm['ENTITY_TYPE_ID'], $arComm['ENTITY_ID']); if ($userID > 0) { break; } } unset($arComm); } } // Try to resolve owner by old-style method--> $arACTION_VARS = explode('&', $ACTION_VARS); for ($i = 0, $ic = count($arACTION_VARS); $i < $ic; $i++) { $v = $arACTION_VARS[$i]; if ($pos = strpos($v, '=')) { $name = substr($v, 0, $pos); ${$name} = urldecode(substr($v, $pos + 1)); } } $arTypeNames = CCrmOwnerType::GetNames(array(CCrmOwnerType::Lead, CCrmOwnerType::Deal, CCrmOwnerType::Contact, CCrmOwnerType::Company)); foreach ($arTypeNames as $typeName) { $regexVar = 'W_CRM_ENTITY_REGEXP_' . $typeName; if (empty(${$regexVar})) { continue; } $match = array(); if (preg_match('/' . ${$regexVar} . '/i' . BX_UTF_PCRE_MODIFIER, $subject, $match) === 1) { $ownerID = intval($match[1]); $ownerTypeID = CCrmOwnerType::ResolveID($typeName); break; } } // <-- Try to resolve owner by old-style method // Filter communications by owner if ($ownerTypeID > 0 && $ownerID > 0) { if (!empty($arCommData)) { foreach ($arCommData as $commKey => $arComm) { if ($arComm['ENTITY_TYPE_ID'] === $ownerTypeID && $arComm['ENTITY_ID'] === $ownerID) { continue; } unset($arCommData[$commKey]); } $arCommData = array_values($arCommData); } if (empty($arCommData)) { if ($addresserID > 0) { foreach ($addresseeEmails as $email) { if ($email === $crmEmail) { continue; } $arCommData = array(self::CreateComm($ownerTypeID, $ownerID, $email)); } } else { $arCommData = array(self::CreateComm($ownerTypeID, $ownerID, $addresserInfo['EMAIL'])); } } } } $arBindingData = self::ConvertCommsToBindings($arCommData); // Check bindings for converted leads --> // Not Existed entities are ignored. Converted leads are ignored if their associated entities (contacts, companies, deals) are contained in bindings. $arCorrectedBindingData = array(); $arConvertedLeadData = array(); foreach ($arBindingData as $bindingKey => &$arBinding) { if ($arBinding['TYPE_ID'] !== CCrmOwnerType::Lead) { if (self::IsEntityExists($arBinding['TYPE_ID'], $arBinding['ID'])) { $arCorrectedBindingData[$bindingKey] = $arBinding; } continue; } $arFields = self::GetEntity(CCrmOwnerType::Lead, $arBinding['ID'], array('STATUS_ID')); if (!is_array($arFields)) { continue; } if (isset($arFields['STATUS_ID']) && $arFields['STATUS_ID'] === 'CONVERTED') { $arConvertedLeadData[$bindingKey] = $arBinding; } else { $arCorrectedBindingData[$bindingKey] = $arBinding; } } unset($arBinding); foreach ($arConvertedLeadData as &$arConvertedLead) { $leadID = $arConvertedLead['ID']; $exists = false; $dbRes = CCrmCompany::GetListEx(array(), array('LEAD_ID' => $leadID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('ID')); if ($dbRes) { while ($arRes = $dbRes->Fetch()) { if (isset($arCorrectedBindingData[self::PrepareEntityKey(CCrmOwnerType::Company, $arRes['ID'])])) { $exists = true; break; } } } if ($exists) { continue; } $dbRes = CCrmContact::GetListEx(array(), array('LEAD_ID' => $leadID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('ID')); if ($dbRes) { while ($arRes = $dbRes->Fetch()) { if (isset($arCorrectedBindingData[self::PrepareEntityKey(CCrmOwnerType::Contact, $arRes['ID'])])) { $exists = true; break; } } } if ($exists) { continue; } $dbRes = CCrmDeal::GetListEx(array(), array('LEAD_ID' => $leadID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('ID')); if ($dbRes) { while ($arRes = $dbRes->Fetch()) { if (isset($arCorrectedBindingData[self::PrepareEntityKey(CCrmOwnerType::Deal, $arRes['ID'])])) { $exists = true; break; } } } if ($exists) { continue; } $arCorrectedBindingData[self::PrepareEntityKey(CCrmOwnerType::Lead, $leadID)] = $arConvertedLead; } unset($arConvertedLead); $arBindingData = $arCorrectedBindingData; // <-- Check bindings for converted leads // If no bindings are found then create new lead from this message // Skip lead creation if email list is empty. Otherwise we will create lead with no email-addresses. It is absolutely useless. $emailQty = count($arCommEmails); if (empty($arBindingData) && $emailQty > 0) { if (strtoupper(COption::GetOptionString('crm', 'email_create_lead_for_new_addresser', 'Y')) !== 'Y') { // Creation of new lead is not allowed return true; } //"Lead from forwarded email..." or "Lead from email..." $title = $subject !== '' ? $subject : GetMessage($addresserID > 0 ? 'CRM_MAIL_LEAD_FROM_USER_EMAIL_TITLE' : 'CRM_MAIL_LEAD_FROM_EMAIL_TITLE', array('%SENDER%' => $addresserInfo['ORIGINAL'])); $comment = ''; if ($body !== '') { // Remove extra new lines (fix for #31807) $comment = preg_replace("/(\r\n|\n|\r)+/", '<br/>', htmlspecialcharsbx($body)); } if ($comment === '') { $comment = htmlspecialcharsbx($subject); } $name = ''; if ($addresserID <= 0) { $name = $addresserInfo['NAME']; } else { //Try get name from body for ($i = 0; $i < $emailQty; $i++) { $email = $arCommEmails[$i]; $match = array(); if (preg_match('/"([^"]+)"\\s*<' . $email . '>/i' . BX_UTF_PCRE_MODIFIER, $body, $match) === 1 && count($match) > 1) { $name = $match[1]; break; } if (preg_match('/"([^"]+)"\\s*[\\s*mailto\\:\\s*' . $email . ']/i' . BX_UTF_PCRE_MODIFIER, $body, $match) === 1 && count($match) > 1) { $name = $match[1]; break; } } if ($name === '') { $name = $arCommEmails[0]; } } $arLeadFields = array('TITLE' => $title, 'NAME' => $name, 'STATUS_ID' => 'NEW', 'COMMENTS' => $comment, 'SOURCE_DESCRIPTION' => GetMessage('CRM_MAIL_LEAD_FROM_EMAIL_SOURCE', array('%SENDER%' => $addresserInfo['ORIGINAL'])), 'OPENED' => 'Y', 'FM' => array('EMAIL' => array())); $sourceList = CCrmStatus::GetStatusList('SOURCE'); $sourceID = COption::GetOptionString('crm', 'email_lead_source_id', ''); if ($sourceID === '' || !isset($sourceList[$sourceID])) { if (isset($sourceList['EMAIL'])) { $sourceID = 'EMAIL'; } elseif (isset($sourceList['OTHER'])) { $sourceID = 'OTHER'; } } if ($sourceID !== '') { $arLeadFields['SOURCE_ID'] = $sourceID; } $responsibleID = intval(COption::GetOptionString('crm', 'email_lead_responsible_id', 0)); if ($responsibleID > 0) { $arLeadFields['CREATED_BY_ID'] = $arLeadFields['MODIFY_BY_ID'] = $arLeadFields['ASSIGNED_BY_ID'] = $responsibleID; if ($userID === 0) { $userID = $responsibleID; } } for ($i = 0; $i < $emailQty; $i++) { $arLeadFields['FM']['EMAIL']['n' . ($i + 1)] = array('VALUE_TYPE' => 'WORK', 'VALUE' => $arCommEmails[$i]); } $leadEntity = new CCrmLead(false); $leadID = $leadEntity->Add($arLeadFields, true, array('DISABLE_USER_FIELD_CHECK' => true, 'REGISTER_SONET_EVENT' => true, 'CURRENT_USER' => $responsibleID)); // TODO: log error if ($leadID > 0) { $arBizProcErrors = array(); CCrmBizProcHelper::AutoStartWorkflows(CCrmOwnerType::Lead, $leadID, CCrmBizProcEventType::Create, $arBizProcErrors); $arCommData = array(); for ($i = 0; $i < $emailQty; $i++) { $arCommData[] = self::CreateComm(CCrmOwnerType::Lead, $leadID, $arCommEmails[$i]); } $arBindingData = array(self::PrepareEntityKey(CCrmOwnerType::Lead, $leadID) => self::CreateBinding(CCrmOwnerType::Lead, $leadID)); } } // Terminate processing if no bindings are found. if (empty($arBindingData)) { // Try to export vcf-files before exit if email from registered user if ($addresserID > 0) { $dbAttachment = CMailAttachment::GetList(array(), array('MESSAGE_ID' => $msgID)); while ($arAttachment = $dbAttachment->Fetch()) { if (GetFileExtension(strtolower($arAttachment['FILE_NAME'])) === 'vcf') { if ($arAttachment['FILE_ID']) { $arAttachment['FILE_DATA'] = CMailAttachment::getContents($arAttachment); } self::TryImportVCard($arAttachment['FILE_DATA']); } } } return false; } // If owner info not defined set it by default if ($ownerID <= 0 || $ownerTypeID <= 0) { if (count($arBindingData) > 1) { // Search owner in specified order: Contact, Company, Lead. $arTypeIDs = array(CCrmOwnerType::Contact, CCrmOwnerType::Company, CCrmOwnerType::Lead); foreach ($arTypeIDs as $typeID) { foreach ($arBindingData as &$arBinding) { if ($arBinding['TYPE_ID'] === $typeID) { $ownerTypeID = $typeID; $ownerID = $arBinding['ID']; break; } } unset($arBinding); if ($ownerID > 0 && $ownerTypeID > 0) { break; } } } if ($ownerID <= 0 || $ownerTypeID <= 0) { $arBinding = array_shift(array_values($arBindingData)); $ownerTypeID = $arBinding['TYPE_ID']; $ownerID = $arBinding['ID']; } } // Precessing of attachments --> $attachmentMaxSizeMb = intval(COption::GetOptionString('crm', 'email_attachment_max_size', 16)); $attachmentMaxSize = $attachmentMaxSizeMb > 0 ? $attachmentMaxSizeMb * 1048576 : 0; $arFilesData = array(); $dbAttachment = CMailAttachment::GetList(array(), array('MESSAGE_ID' => $msgID)); $arBannedAttachments = array(); while ($arAttachment = $dbAttachment->Fetch()) { if ($arAttachment['FILE_NAME'] === '1.tmp') { // HACK: For bug in module 'Mail' continue; } elseif (GetFileExtension(strtolower($arAttachment['FILE_NAME'])) === 'vcf') { if ($arAttachment['FILE_ID']) { $arAttachment['FILE_DATA'] = CMailAttachment::getContents($arAttachment); } self::TryImportVCard($arAttachment['FILE_DATA']); } $fileSize = isset($arAttachment['FILE_SIZE']) ? intval($arAttachment['FILE_SIZE']) : 0; if ($fileSize <= 0) { //Skip zero lenth files continue; } if ($attachmentMaxSize > 0 && $fileSize > $attachmentMaxSize) { //File size limit is exceeded $arBannedAttachments[] = array('name' => $arAttachment['FILE_NAME'], 'size' => $fileSize); continue; } if ($arAttachment['FILE_ID'] && empty($arAttachment['FILE_DATA'])) { $arAttachment['FILE_DATA'] = CMailAttachment::getContents($arAttachment); } $arFilesData[] = array('name' => $arAttachment['FILE_NAME'], 'type' => $arAttachment['CONTENT_TYPE'], 'content' => $arAttachment['FILE_DATA'], 'MODULE_ID' => 'crm'); } //<-- Precessing of attachments // Remove extra new lines (fix for #31807) $body = preg_replace("/(\r\n|\n|\r)+/", PHP_EOL, $body); $encodedBody = htmlspecialcharsbx($body); // Creating of new event --> $arEventBindings = array(); foreach ($arBindingData as &$arBinding) { $arEventBindings[] = array('ENTITY_TYPE' => $arBinding['TYPE_NAME'], 'ENTITY_ID' => $arBinding['ID']); } unset($arBinding); $eventText = ''; $eventText .= '<b>' . GetMessage('CRM_EMAIL_SUBJECT') . '</b>: ' . $subject . PHP_EOL; $eventText .= '<b>' . GetMessage('CRM_EMAIL_FROM') . '</b>: ' . $addresserInfo['EMAIL'] . PHP_EOL; $eventText .= '<b>' . GetMessage('CRM_EMAIL_TO') . '</b>: ' . implode($addresseeEmails, '; ') . PHP_EOL; if (!empty($arBannedAttachments)) { $eventText .= '<b>' . GetMessage('CRM_EMAIL_BANNENED_ATTACHMENTS', array('%MAX_SIZE%' => $attachmentMaxSizeMb)) . '</b>: '; foreach ($arBannedAttachments as &$attachmentInfo) { $eventText .= GetMessage('CRM_EMAIL_BANNENED_ATTACHMENT_INFO', array('%NAME%' => $attachmentInfo['name'], '%SIZE%' => round($attachmentInfo['size'] / 1048576, 1))); } unset($attachmentInfo); $eventText .= PHP_EOL; } $eventText .= $encodedBody; $CCrmEvent = new CCrmEvent(); $CCrmEvent->Add(array('USER_ID' => $userID, 'ENTITY' => array_values($arEventBindings), 'ENTITY_TYPE' => CCrmOwnerType::ResolveName($ownerTypeID), 'ENTITY_ID' => $ownerID, 'EVENT_NAME' => GetMessage('CRM_EMAIL_GET_EMAIL'), 'EVENT_TYPE' => 2, 'EVENT_TEXT_1' => $eventText, 'FILES' => $arFilesData), false); // <-- Creating of new event // Creating new activity --> $siteID = ''; $dbSites = CSite::GetList($by = 'sort', $order = 'desc', array('DEFAULT' => 'Y', 'ACTIVE' => 'Y')); $defaultSite = is_object($dbSites) ? $dbSites->Fetch() : null; if (is_array($defaultSite)) { $siteID = $defaultSite['LID']; } if ($siteID === '') { $siteID = 's1'; } $storageTypeID = CCrmActivity::GetDefaultStorageTypeID(); $arElementIDs = array(); foreach ($arFilesData as $fileData) { $fileID = CFile::SaveFile($fileData, 'crm'); if ($fileID > 0) { $elementID = StorageManager::saveEmailAttachment(CFile::GetFileArray($fileID), $storageTypeID, $siteID); if ($elementID > 0) { $arElementIDs[] = (int) $elementID; } } } $descr = preg_replace("/(\r\n|\n|\r)+/", '<br/>', $encodedBody); $now = ConvertTimeStamp(time() + CTimeZone::GetOffset(), 'FULL', $siteID); $direction = CCrmActivityDirection::Incoming; $completed = 'N'; // Incomming emails must be marked as 'Not Completed'. if ($addresserID > 0 && ActivitySettings::getValue(ActivitySettings::MARK_FORWARDED_EMAIL_AS_OUTGOING)) { $direction = CCrmActivityDirection::Outgoing; $completed = 'Y'; } $arActivityFields = array('OWNER_ID' => $ownerID, 'OWNER_TYPE_ID' => $ownerTypeID, 'TYPE_ID' => CCrmActivityType::Email, 'ASSOCIATED_ENTITY_ID' => 0, 'PARENT_ID' => $parentID, 'SUBJECT' => $subject, 'START_TIME' => $now, 'END_TIME' => $now, 'COMPLETED' => $completed, 'AUTHOR_ID' => $userID, 'RESPONSIBLE_ID' => $userID, 'PRIORITY' => CCrmActivityPriority::Medium, 'DESCRIPTION' => $descr, 'DESCRIPTION_TYPE' => CCrmContentType::Html, 'DIRECTION' => $direction, 'LOCATION' => '', 'NOTIFY_TYPE' => CCrmActivityNotifyType::None, 'STORAGE_TYPE_ID' => $storageTypeID, 'STORAGE_ELEMENT_IDS' => $arElementIDs); $arActivityFields['BINDINGS'] = array(); foreach ($arBindingData as &$arBinding) { $entityTypeID = $arBinding['TYPE_ID']; $entityID = $arBinding['ID']; if ($entityTypeID <= 0 || $entityID <= 0) { continue; } $arActivityFields['BINDINGS'][] = array('OWNER_TYPE_ID' => $entityTypeID, 'OWNER_ID' => $entityID); } unset($arBinding); $activityID = CCrmActivity::Add($arActivityFields, false, false, array('REGISTER_SONET_EVENT' => true)); if ($activityID > 0 && !empty($arCommData)) { CCrmActivity::SaveCommunications($activityID, $arCommData, $arActivityFields, false, false); $arActivityFields['COMMUNICATIONS'] = $arCommData; } //Notity responsible user if ($userID > 0 && $direction === CCrmActivityDirection::Incoming) { CCrmActivity::Notify($arActivityFields, CCrmNotifierSchemeType::IncomingEmail); } // <-- Creating new activity return true; }
public static function RegisterExportEvent($entityTypeID, $entityID, $userID = 0) { if ($userID <= 0) { $userID = CCrmSecurityHelper::GetCurrentUserID(); if ($userID <= 0) { return false; } } $eventType = CCrmEvent::TYPE_EXPORT; $timestamp = time() + CTimeZone::GetOffset(); $entityTypeName = CCrmOwnerType::ResolveName($entityTypeID); $entity = new CCrmEvent(); $entity->Add(array('USER_ID' => $userID, 'ENTITY_ID' => $entityID, 'ENTITY_TYPE' => $entityTypeName, 'EVENT_TYPE' => $eventType, 'EVENT_NAME' => CCrmEvent::GetEventTypeName($eventType), 'DATE_CREATE' => ConvertTimeStamp($timestamp, 'FULL', SITE_ID)), false); return true; }
foreach ($arFmUserList as $_sEmail) { $arFilter[] = array('TYPE_ID' => 'EMAIL', 'VALUE' => $_sEmail); } $obEntityR = CCrmFieldMulti::GetList(array(), array('ENTITY_ID' => 'LEAD|CONTACT|COMPANY', 'FILTER' => $arFilter), array('ID', 'ENTITY_ID')); while ($arEntityR = $obEntityR->Fetch()) { // key to disable dublicate $arEntity[$arEntityR['ELEMENT_ID']] = array('ENTITY_TYPE' => $arEntityR['ENTITY_ID'], 'ENTITY_ID' => (int) $arEntityR['ELEMENT_ID']); } $CCrmEvent = new CCrmEvent(); $sBodyEvent = ''; $sBodyEvent .= GetMessage('CRM_SUBSCRIBE_SUBJECT') . ': ' . $arFields['SUBJECT'] . "\n\r"; $sBodyEvent .= GetMessage('CRM_SUBSCRIBE_FROM') . ': ' . $arFields['FROM_FIELD'] . "\n\r"; $sBodyEvent .= GetMessage('CRM_SUBSCRIBE_TO') . ': ' . $arFields['BCC_FIELD'] . "\n\r\n\r"; $sBodyEvent .= $_POST['COMMENTS']; if (!empty($arEntity)) { $CCrmEvent->Add(array('ENTITY' => $arEntity, 'EVENT_ID' => 'MESSAGE', 'EVENT_TEXT_1' => $sBodyEvent, 'FILES' => !empty($_FILES['ATTACH']) ? $_FILES['ATTACH'] : array())); } // Try add event to entity of context if ($arResult['FORM_ENTITY_TYPE'] !== $arResult['ENTITY_TYPE'] && $arResult['FORM_ENTITY_ID'] !== $arResult['ENTITY_ID']) { $CCrmEvent->Add(array('ENTITY' => array($arResult['FORM_ENTITY_ID'] => array('ENTITY_TYPE' => $arResult['FORM_ENTITY_TYPE'], 'ENTITY_ID' => $arResult['FORM_ENTITY_ID'])), 'EVENT_ID' => 'MESSAGE', 'EVENT_TEXT_1' => $sBodyEvent, 'FILES' => !empty($_FILES['ATTACH']) ? $_FILES['ATTACH'] : array())); } } $arResult['EVENT_PAGE'] = CHTTP::urlAddParams($_POST['EVENT_PAGE'], array('CRM_' . trim($arResult['FORM_ENTITY_TYPE']) . '_' . trim($arParams['FORM_TYPE']) . '_active_tab' => !empty($_REQUEST['TAB_ID']) ? $_REQUEST['TAB_ID'] : 'tab_event')); } // check if only one is selected form the entity of a choice on which mailbox to send $arResult['EMAIL'] = array(); if (count($arResult['ENTITY_ID']) == 1 && $arResult['ENTITY_ID'][0] > 0) { $arFilter = array('ENTITY_ID' => $arResult['ENTITY_TYPE'], 'TYPE_ID' => 'EMAIL', 'ELEMENT_ID' => $arResult['ENTITY_ID']); $obRes = CCrmFieldMulti::GetList(array('COMPLEX_ID' => 'desc', 'ID' => 'asc'), $arFilter); while ($arRow = $obRes->Fetch()) { $arResult['EMAIL']['REFERENCE'][] = CCrmFieldMulti::GetEntityNameByComplex($arRow['COMPLEX_ID']) . ': ' . $arRow['VALUE'];
private static function RegisterEvents($ownerType, $ownerID, $arEvents, $checkPerms) { global $USER; $userID = isset($USER) && $USER instanceof CUser && 'CUser' === get_class($USER) ? $USER->GetId() : 0; $CCrmEvent = new CCrmEvent(); foreach ($arEvents as $arEvent) { $arEvent['EVENT_TYPE'] = 1; $arEvent['ENTITY_TYPE'] = CCrmOwnerTypeAbbr::ResolveName($ownerType); $arEvent['ENTITY_ID'] = $ownerID; $arEvent['ENTITY_FIELD'] = 'PRODUCT_ROWS'; if ($userID > 0) { $arEvent['USER_ID'] = $userID; } $CCrmEvent->Add($arEvent, $checkPerms); } return true; }