public static function Update($ID, $arFields, $checkPerms = true, $regEvent = true, $options = array()) { global $DB; if (!is_array($options)) { $options = array(); } $arPrevEntity = self::GetByID($ID, $checkPerms); if (!$arPrevEntity) { return false; // is not exists } if (!self::CheckFields('UPDATE', $arFields, $ID, array('PREVIOUS_FIELDS' => $arPrevEntity))) { return false; } $arPrevBindings = self::GetBindings($ID); $arRecordBindings = array(); $storageElementIDs = isset($arFields['STORAGE_ELEMENT_IDS']) ? $arFields['STORAGE_ELEMENT_IDS'] : null; $storageElementsSerialized = false; if (is_array($storageElementIDs)) { $storageElementIDs = self::NormalizeStorageElementIDs($storageElementIDs); $arFields['STORAGE_ELEMENT_IDS'] = serialize($storageElementIDs); $storageElementsSerialized = true; } elseif ($storageElementIDs !== null) { //Skip Storage Elements Processing - Treat As Not Changed $storageElementIDs = null; } if (isset($arFields['STORAGE_ELEMENT_IDS'])) { $arRecordBindings['STORAGE_ELEMENT_IDS'] = $arFields['STORAGE_ELEMENT_IDS']; } if (isset($arFields['SETTINGS'])) { if (is_array($arFields['SETTINGS'])) { $arFields['SETTINGS'] = serialize($arFields['SETTINGS']); } $arRecordBindings['SETTINGS'] = $arFields['SETTINGS']; } if (isset($arFields['DESCRIPTION'])) { $arRecordBindings['DESCRIPTION'] = $arFields['DESCRIPTION']; } $arBindings = isset($arFields['BINDINGS']) && is_array($arFields['BINDINGS']) ? $arFields['BINDINGS'] : null; if (is_array($arBindings)) { $bindingQty = count($arBindings); if ($bindingQty === 1) { // Change activity ownership if only one binding defined $arBinding = $arBindings[0]; $arFields['OWNER_ID'] = $arBinding['OWNER_ID']; $arFields['OWNER_TYPE_ID'] = $arBinding['OWNER_TYPE_ID']; } elseif ($bindingQty === 0) { // Clear activity ownership if only no bindings are defined $arFields['OWNER_ID'] = 0; $arFields['OWNER_TYPE_ID'] = CCrmOwnerType::Undefined; } } self::NormalizeDateTimeFields($arFields); if (isset($arFields['ID'])) { unset($arFields['ID']); } $sql = 'UPDATE ' . CCrmActivity::TABLE_NAME . ' SET ' . $DB->PrepareUpdate(CCrmActivity::TABLE_NAME, $arFields) . ' WHERE ID = ' . $ID; if (!empty($arRecordBindings)) { $DB->QueryBind($sql, $arRecordBindings, false); } else { $DB->Query($sql, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__); } $arFields['SETTINGS'] = isset($arFields['SETTINGS']) ? unserialize($arFields['SETTINGS']) : array(); CCrmEntityHelper::RemoveCached(self::CACHE_NAME, $ID); $storageTypeID = isset($arFields['STORAGE_TYPE_ID']) ? intval($arFields['STORAGE_TYPE_ID']) : StorageType::Undefined; if ($storageTypeID === StorageType::Undefined) { $storageTypeID = isset($arPrevEntity['STORAGE_TYPE_ID']) ? intval($arPrevEntity['STORAGE_TYPE_ID']) : self::GetDefaultStorageTypeID(); } if (is_array($storageElementIDs)) { CCrmActivity::DoSaveElementIDs($ID, $storageTypeID, $storageElementIDs); } $arCurEntity = self::GetByID($ID, false); if (is_array($arBindings)) { $bindingsChanged = !self::IsBindingsEquals($arBindings, $arPrevBindings); if ($bindingsChanged) { self::SaveBindings($ID, $arBindings, false, false); } } else { $arBindings = $arPrevBindings; $bindingsChanged = false; } $prevCompleted = isset($arPrevEntity['COMPLETED']) && $arPrevEntity['COMPLETED'] === 'Y'; $curCompleted = isset($arCurEntity['COMPLETED']) && $arCurEntity['COMPLETED'] === 'Y'; $prevDeadline = isset($arPrevEntity['DEADLINE']) ? $arPrevEntity['DEADLINE'] : ''; $curDeadline = isset($arCurEntity['DEADLINE']) ? $arCurEntity['DEADLINE'] : ''; if ($prevCompleted && $prevDeadline && ($bindingsChanged || $prevCompleted != $curCompleted || $prevDeadline !== $curDeadline)) { $deadline = new \Bitrix\Main\Type\DateTime($prevDeadline); $deadline->setTime(0, 0, 0); foreach ($arPrevBindings as &$arBinding) { $curOwnerTypeID = isset($arBinding['OWNER_TYPE_ID']) ? intval($arBinding['OWNER_TYPE_ID']) : 0; $curOwnerID = isset($arBinding['OWNER_ID']) ? intval($arBinding['OWNER_ID']) : 0; if ($curOwnerTypeID === CCrmOwnerType::Deal && $curOwnerID > 0) { Bitrix\Crm\Statistics\DealActivityStatisticEntry::register($curOwnerID, null, array('DATE' => $deadline)); } } unset($arBinding); } if ($curCompleted && $curDeadline !== '') { $deadline = new \Bitrix\Main\Type\DateTime($curDeadline); $deadline->setTime(0, 0, 0); foreach ($arBindings as &$arBinding) { $curOwnerTypeID = isset($arBinding['OWNER_TYPE_ID']) ? intval($arBinding['OWNER_TYPE_ID']) : 0; $curOwnerID = isset($arBinding['OWNER_ID']) ? intval($arBinding['OWNER_ID']) : 0; if ($curOwnerTypeID === CCrmOwnerType::Deal && $curOwnerID > 0) { Bitrix\Crm\Statistics\DealActivityStatisticEntry::register($curOwnerID, null, array('DATE' => $deadline)); } } unset($arBinding); } // Synchronize user activity --> $arSyncKeys = array(); $responsibleID = isset($arFields['RESPONSIBLE_ID']) ? intval($arFields['RESPONSIBLE_ID']) : (isset($arPrevEntity['RESPONSIBLE_ID']) ? intval($arPrevEntity['RESPONSIBLE_ID']) : 0); foreach ($arBindings as &$arBinding) { if ($responsibleID > 0) { self::SynchronizeUserActivity($arBinding['OWNER_TYPE_ID'], $arBinding['OWNER_ID'], $responsibleID); $arSyncKeys[] = "{$arBinding['OWNER_TYPE_ID']}_{$arBinding['OWNER_ID']}_{$responsibleID}"; } self::SynchronizeUserActivity($arBinding['OWNER_TYPE_ID'], $arBinding['OWNER_ID'], 0); $arSyncKeys[] = "{$arBinding['OWNER_TYPE_ID']}_{$arBinding['OWNER_ID']}"; } unset($arBinding); $prevResponsibleID = isset($arPrevEntity['RESPONSIBLE_ID']) ? intval($arPrevEntity['RESPONSIBLE_ID']) : 0; if (!empty($arPrevBindings)) { foreach ($arPrevBindings as &$arBinding) { if ($prevResponsibleID > 0 && !in_array("{$arBinding['OWNER_TYPE_ID']}_{$arBinding['OWNER_ID']}_{$prevResponsibleID}", $arSyncKeys, true)) { self::SynchronizeUserActivity($arBinding['OWNER_TYPE_ID'], $arBinding['OWNER_ID'], $prevResponsibleID); } if (!in_array("{$arBinding['OWNER_TYPE_ID']}_{$arBinding['OWNER_ID']}", $arSyncKeys, true)) { self::SynchronizeUserActivity($arBinding['OWNER_TYPE_ID'], $arBinding['OWNER_ID'], 0); } } unset($arBinding); } // <-- Synchronize user activity if ($regEvent) { foreach ($arBindings as &$arBinding) { self::RegisterUpdateEvent($arBinding['OWNER_TYPE_ID'], $arBinding['OWNER_ID'], $arCurEntity, $arPrevEntity, false); } unset($arBinding); } $typeID = isset($arCurEntity['TYPE_ID']) ? intval($arCurEntity['TYPE_ID']) : CCrmActivityType::Undefined; $skipAssocEntity = isset($options['SKIP_ASSOCIATED_ENTITY']) ? (bool) $options['SKIP_ASSOCIATED_ENTITY'] : false; if (!$skipAssocEntity && $typeID > 0) { switch ($typeID) { case CCrmActivityType::Call: case CCrmActivityType::Meeting: $completed = isset($arCurEntity['COMPLETED']) ? $arCurEntity['COMPLETED'] === 'Y' : false; // Check for settings $displayCompleted = $typeID === CCrmActivityType::Call ? CCrmActivityCalendarSettings::GetValue(CCrmActivityCalendarSettings::DisplayCompletedCalls, true) : CCrmActivityCalendarSettings::GetValue(CCrmActivityCalendarSettings::DisplayCompletedMeetings, true); if (!$completed || $displayCompleted) { $arCurEntity['BINDINGS'] = $arBindings; $eventID = self::SaveCalendarEvent($arCurEntity); if (is_int($eventID) && $eventID > 0) { $DB->Query('UPDATE ' . CCrmActivity::TABLE_NAME . ' SET ' . $DB->PrepareUpdate(CCrmActivity::TABLE_NAME, array('ASSOCIATED_ENTITY_ID' => $eventID)) . ' WHERE ID = ' . $ID, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__); } } else { if (self::DeleteCalendarEvent($arCurEntity)) { $DB->Query('UPDATE ' . CCrmActivity::TABLE_NAME . ' SET ' . $DB->PrepareUpdate(CCrmActivity::TABLE_NAME, array('ASSOCIATED_ENTITY_ID' => 0)) . ' WHERE ID = ' . $ID, false, 'File: ' . __FILE__ . '<br>Line: ' . __LINE__); } } break; case CCrmActivityType::Task: self::SaveTask($arCurEntity); break; case CCrmActivityType::Email: //do nothing break; } } $registerSonetEvent = isset($options['REGISTER_SONET_EVENT']) && $options['REGISTER_SONET_EVENT'] === true; $isSonetEventRegistred = false; if ($registerSonetEvent) { $isSonetEventSynchronized = self::SynchronizeLiveFeedEvent($ID, array('PROCESS_BINDINGS' => $bindingsChanged, 'BINDINGS' => $bindingsChanged ? $arBindings : null, 'REFRESH_DATE' => isset($arFields['COMPLETED']) && $arFields['COMPLETED'] !== $arPrevEntity['COMPLETED'], 'START_RESPONSIBLE_ID' => $arPrevEntity['RESPONSIBLE_ID'], 'FINAL_RESPONSIBLE_ID' => $responsibleID, 'EDITOR_ID' => intval($arFields["EDITOR_ID"]) > 0 ? $arFields["EDITOR_ID"] : CCrmSecurityHelper::GetCurrentUserID(), 'TYPE_ID' => $typeID, 'SUBJECT' => isset($arFields['SUBJECT']) ? $arFields['SUBJECT'] : $arPrevEntity['SUBJECT'])); if (!$isSonetEventSynchronized) { $itemFields = self::GetByID($ID); if (is_array($itemFields)) { $itemFields['BINDINGS'] = $arBindings; $sonetEventID = self::RegisterLiveFeedEvent($itemFields); $isSonetEventRegistred = is_int($sonetEventID) && $sonetEventID > 0; if ($responsibleID > 0) { CCrmSonetSubscription::RegisterSubscription(CCrmOwnerType::Activity, $ID, CCrmSonetSubscriptionType::Responsibility, $responsibleID); } } } } if (!$isSonetEventRegistred && $responsibleID !== $prevResponsibleID) { CCrmSonetSubscription::ReplaceSubscriptionByEntity(CCrmOwnerType::Activity, $ID, CCrmSonetSubscriptionType::Responsibility, $responsibleID, $prevResponsibleID, $registerSonetEvent); } if ($storageElementsSerialized) { $arFields['STORAGE_ELEMENT_IDS'] = $storageElementIDs; } $rsEvents = GetModuleEvents('crm', 'OnActivityUpdate'); while ($arEvent = $rsEvents->Fetch()) { ExecuteModuleEventEx($arEvent, array($ID, &$arFields)); } if (defined("BX_COMP_MANAGED_CACHE")) { $GLOBALS["CACHE_MANAGER"]->ClearByTag("CRM_ACTIVITY_" . $ID); } return true; }
CCrmStatus::EnableDepricatedTypes(isset($_POST['ENABLE_DEPRECATED_STATUSES']) && strtoupper($_POST['ENABLE_DEPRECATED_STATUSES']) === 'Y'); \Bitrix\Crm\Settings\DealSettings::enableCloseDateSync(isset($_POST['REFRESH_DEAL_CLOSEDATE']) && strtoupper($_POST['REFRESH_DEAL_CLOSEDATE']) === 'Y'); if ($_POST['DEAL_DEFAULT_LIST_VIEW']) { \Bitrix\Crm\Settings\DealSettings::setDefaultListViewID($_POST['DEAL_DEFAULT_LIST_VIEW']); } LocalRedirect(CComponentEngine::MakePathFromTemplate($arParams['PATH_TO_SM_CONFIG'], array())); } } } $arResult['FORM_ID'] = 'CRM_SM_CONFIG'; $arResult['BACK_URL'] = $arParams['PATH_TO_SM_CONFIG']; $arResult['FIELDS'] = array(); $arResult['FIELDS']['tab_deal_config'][] = array('id' => 'DEAL_DEFAULT_LIST_VIEW', 'name' => GetMessage('CRM_FIELD_DEAL_DEFAULT_LIST_VIEW'), 'items' => \Bitrix\Crm\Settings\DealSettings::getViewDescriptions(), 'type' => 'list', 'value' => \Bitrix\Crm\Settings\DealSettings::getDefaultListViewID(), 'required' => false); $arResult['FIELDS']['tab_deal_config'][] = array('id' => 'REFRESH_DEAL_CLOSEDATE', 'name' => GetMessage('CRM_FIELD_REFRESH_DEAL_CLOSEDATE'), 'type' => 'checkbox', 'value' => \Bitrix\Crm\Settings\DealSettings::isCloseDateSyncEnabled(), 'required' => false); $arResult['FIELDS']['tab_activity_config'][] = array('id' => 'CALENDAR_DISPLAY_COMPLETED_CALLS', 'name' => GetMessage('CRM_FIELD_DISPLAY_COMPLETED_CALLS_IN_CALENDAR'), 'type' => 'checkbox', 'value' => CCrmActivityCalendarSettings::GetValue(CCrmActivityCalendarSettings::DisplayCompletedCalls, true), 'required' => false); $arResult['FIELDS']['tab_activity_config'][] = array('id' => 'CALENDAR_DISPLAY_COMPLETED_MEETINGS', 'name' => GetMessage('CRM_FIELD_DISPLAY_COMPLETED_MEETINGS_IN_CALENDAR'), 'type' => 'checkbox', 'value' => CCrmActivityCalendarSettings::GetValue(CCrmActivityCalendarSettings::DisplayCompletedMeetings, true), 'required' => false); $arResult['FIELDS']['tab_activity_config'][] = array('id' => 'RECKON_ACTIVITYLESS_ITEMS_IN_COUNTERS', 'name' => GetMessage('CRM_FIELD_RECKON_ACTIVITYLESS_ITEMS_IN_COUNTERS'), 'type' => 'checkbox', 'value' => CCrmUserCounterSettings::GetValue(CCrmUserCounterSettings::ReckonActivitylessItems, true), 'required' => false); $arResult['FIELDS']['tab_outgoing_email'][] = array('id' => 'SERVICE_CODE_ALLOCATION', 'name' => GetMessage('CRM_FIELD_SERVICE_CODE_ALLOCATION'), 'items' => CCrmEMailCodeAllocation::GetAllDescriptions(), 'type' => 'list', 'value' => CCrmEMailCodeAllocation::GetCurrent(), 'required' => false); if (Bitrix\Crm\Integration\Bitrix24Email::isEnabled()) { if (Bitrix\Crm\Integration\Bitrix24Email::allowDisableSignature()) { $arResult['FIELDS']['tab_outgoing_email'][] = array('id' => 'ENABLE_B24_EMAIL_SIGNATURE', 'name' => GetMessage('CRM_FIELD_ENABLE_B24_EMAIL_SIGNATURE'), 'type' => 'checkbox', 'value' => Bitrix\Crm\Integration\Bitrix24Email::isSignatureEnabled(), 'required' => false); } else { $arResult['FIELDS']['tab_outgoing_email'][] = array('id' => 'ENABLE_B24_EMAIL_SIGNATURE', 'name' => GetMessage('CRM_FIELD_ENABLE_B24_EMAIL_SIGNATURE'), 'type' => 'label', 'value' => Bitrix\Crm\Integration\Bitrix24Email::getSignatureExplanation(), 'required' => false); } } $arResult['FIELDS']['tab_format'][] = array('id' => 'PERSON_NAME_FORMAT_ID', 'name' => GetMessage('CRM_FIELD_PERSON_NAME_FORMAT'), 'type' => 'list', 'items' => \Bitrix\Crm\Format\PersonNameFormatter::getAllDescriptions(), 'value' => \Bitrix\Crm\Format\PersonNameFormatter::getFormatID(), 'required' => false); $arResult['FIELDS']['tab_format'][] = array('id' => 'CALLTO_FORMAT', 'name' => GetMessage('CRM_FIELD_CALLTO_FORMAT'), 'type' => 'list', 'items' => CCrmCallToUrl::GetAllDescriptions(), 'value' => CCrmCallToUrl::GetFormat(CCrmCallToUrl::Bitrix), 'required' => false); $calltoSettings = CCrmCallToUrl::GetCustomSettings(); $arResult['FIELDS']['tab_format'][] = array('id' => 'CALLTO_URL_TEMPLATE', 'name' => GetMessage('CRM_FIELD_CALLTO_URL_TEMPLATE'), 'type' => 'text', 'value' => isset($calltoSettings['URL_TEMPLATE']) ? $calltoSettings['URL_TEMPLATE'] : 'callto:[phone]', 'required' => false); $arResult['FIELDS']['tab_format'][] = array('id' => 'CALLTO_CLICK_HANDLER', 'name' => GetMessage('CRM_FIELD_CALLTO_CLICK_HANDLER'), 'type' => 'textarea', 'value' => isset($calltoSettings['CLICK_HANDLER']) ? $calltoSettings['CLICK_HANDLER'] : '', 'required' => false); $arResult['FIELDS']['tab_format'][] = array('id' => 'CALLTO_NORMALIZE_NUMBER', 'name' => GetMessage('CRM_FIELD_CALLTO_NORMALIZE_NUMBER'), 'type' => 'checkbox', 'value' => isset($calltoSettings['NORMALIZE_NUMBER']) ? $calltoSettings['NORMALIZE_NUMBER'] === 'Y' : true, 'required' => false);