Exemplo n.º 1
0
 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;
 }