Файловый менеджер - Редактировать - /var/www/axolotl/data/www/axolotls.ru/www/bitrix/modules/crm/lib/recycling/leadcontroller.php
Назад
<?php namespace Bitrix\Crm\Recycling; use Bitrix\Main; use Bitrix\Crm; Main\Localization\Loc::loadMessages(__FILE__); class LeadController extends BaseController { use MultiFieldControllerMixin { recoverMultiFields as innerRecoverMultiFields; } use ActivityControllerMixin; use AddressControllerMixin; use ProductRowControllerMixin; use ObserverControllerMixin; use ChatControllerMixin; use WaitingControllerMixin; /** @var LeadController|null */ protected static $instance = null; /** * @return LeadController|null */ public static function getInstance() { if(self::$instance === null) { self::$instance = new LeadController(); } return self::$instance; } public static function getFieldNames() { return array( 'ID', 'DATE_CREATE', 'DATE_MODIFY', 'CREATED_BY_ID', 'MODIFY_BY_ID', 'ASSIGNED_BY_ID', 'TITLE', 'STATUS_ID', 'STATUS_DESCRIPTION', 'SOURCE_ID', 'SOURCE_DESCRIPTION', 'CURRENCY_ID', 'OPPORTUNITY', 'HONORIFIC', 'NAME', 'LAST_NAME', 'SECOND_NAME', 'BIRTHDATE', 'POST', 'COMMENTS', 'COMPANY_TITLE', 'COMPANY_ID', 'CONTACT_ID', 'OPENED', 'DATE_CLOSED', 'WEBFORM_ID', 'FACE_ID', 'IS_RETURN_CUSTOMER', 'ORIGINATOR_ID', 'ORIGIN_ID' ); } /** * Get Entity Type ID * @return int */ public function getEntityTypeID() { return \CCrmOwnerType::Lead; } /** * Get Suspended Entity Type ID * @return int */ public function getSuspendedEntityTypeID() { return \CCrmOwnerType::SuspendedLead; } /** * Get recyclebin entity type name. * @see \Bitrix\Crm\Integration\Recyclebin\Lead::getEntityName * @return string */ public function getRecyclebinEntityTypeName() { return 'crm_lead'; } //region ProductRowController /** * Get Product Row Owner Type * @return string */ public function getProductRowOwnerType() { return 'L'; } /** * Get Product Row Suspended Owner Type * @return string */ public function getProductRowSuspendedOwnerType() { return 'SL'; } //endregion public function getActivityOwnerNotFoundMessage($entityTypeID, $entityID, array $params) { $entityTitle = Crm\Integration\Recyclebin\RecyclingManager::resolveEntityTitle( \CCrmOwnerType::Lead, $entityID ); return Main\Localization\Loc::getMessage( 'CRM_LEAD_CTRL_ACTIVITY_OWNER_NOT_FOUND', [ '#OWNER_TITLE#' => $entityTitle, '#OWNER_ID#' => $entityID, '#ID#' => isset($params['ID']) ? $params['ID'] : '', '#TITLE#' => isset($params['title']) ? $params['title'] : '' ] ); } public function getEntityFields($entityID) { $dbResult = \CCrmLead::GetListEx( array(), array('=ID' => $entityID, 'CHECK_PERMISSIONS' => 'N'), false, false, array('*') ); $fields = $dbResult->Fetch(); return is_array($fields) ? $fields : null; } public function prepareEntityData($entityID, array $params = array()) { $fields = isset($params['FIELDS']) && is_array($params['FIELDS']) ? $params['FIELDS'] : null; if(empty($fields)) { $fields = $this->getEntityFields($entityID); } if(empty($fields)) { throw new Main\ObjectNotFoundException("Could not find entity: #{$entityID}."); } $slots = array('FIELDS' => array_intersect_key($fields, array_flip(self::getFieldNames()))); $companyID = isset($fields['COMPANY_ID']) ? (int)$fields['COMPANY_ID'] : 0; if($companyID > 0) { $slots['COMPANY_ID'] = $companyID; } $contactIDs = Crm\Binding\LeadContactTable::getLeadContactIDs($entityID); if(!empty($contactIDs)) { $slots['CONTACT_IDS'] = $contactIDs; } $childContactIDs = Crm\Entity\Lead::getChildEntityIDs($entityID, \CCrmOwnerType::Contact); if(!empty($childContactIDs)) { $slots['CHILD_CONTACT_IDS'] = $childContactIDs; } $childCompanyIDs = Crm\Entity\Lead::getChildEntityIDs($entityID, \CCrmOwnerType::Company); if(!empty($childCompanyIDs)) { $slots['CHILD_COMPANY_IDS'] = $childCompanyIDs; } $childDealIDs = Crm\Entity\Lead::getChildEntityIDs($entityID, \CCrmOwnerType::Deal); if(!empty($childDealIDs)) { $slots['CHILD_DEAL_IDS'] = $childDealIDs; } $slots = array_merge($slots, $this->prepareActivityData($entityID, $params)); return array( 'TITLE' => \CCrmOwnerType::GetCaption( \CCrmOwnerType::Lead, $entityID, false, array('FIELDS' => $fields) ), 'SLOTS' => $slots ); } /** * Move entity to Recycle Bin. * @param int $entityID Entity ID. * @param array $params Additional operation parameters. * @return void * @throws Crm\Synchronization\UserFieldSynchronizationException * @throws Main\ArgumentException * @throws Main\ArgumentOutOfRangeException * @throws Main\Db\SqlQueryException * @throws Main\InvalidOperationException * @throws Main\LoaderException * @throws Main\ObjectException * @throws Main\ObjectNotFoundException * @throws Main\SystemException */ public function moveToBin($entityID, array $params = array()) { if(!Main\Loader::includeModule('recyclebin')) { throw new Main\InvalidOperationException("Could not load module RecycleBin."); } $fields = isset($params['FIELDS']) && is_array($params['FIELDS']) ? $params['FIELDS'] : null; if(empty($fields)) { $fields = $params['FIELDS'] = $this->getEntityFields($entityID); } if(empty($fields)) { throw new Main\ObjectNotFoundException("Could not find entity: #{$entityID}."); } $entityData = $this->prepareEntityData($entityID, $params); $recyclingEntity = Crm\Integration\Recyclebin\Lead::createRecycleBinEntity($entityID); $recyclingEntity->setTitle($entityData['TITLE']); $slots = isset($entityData['SLOTS']) && is_array($entityData['SLOTS']) ? $entityData['SLOTS'] : array(); $relations = LeadRelationManager::getInstance()->buildCollection($entityID, $slots); foreach($slots as $slotKey => $slotData) { $recyclingEntity->add($slotKey, $slotData); } $result = $recyclingEntity->save(); $errors = $result->getErrors(); if(!empty($errors)) { throw new Main\SystemException($errors[0]->getMessage(), $errors[0]->getCode()); } $recyclingEntityID = $recyclingEntity->getId(); //region Convert User Fields to Suspended Type $suspendedUserFields = $this->prepareSuspendedUserFields($entityID); if(!empty($suspendedUserFields)) { $this->saveSuspendedUserFields($recyclingEntityID, $suspendedUserFields); } //endregion $this->suspendActivities($entityData, $entityID, $recyclingEntityID); $this->suspendMultiFields($entityID, $recyclingEntityID); $this->suspendAddresses($entityID, $recyclingEntityID); $this->suspendTimeline($entityID, $recyclingEntityID); $this->suspendDocuments($entityID, $recyclingEntityID); $this->suspendLiveFeed($entityID, $recyclingEntityID); $this->suspendUtm($entityID, $recyclingEntityID); $this->suspendTracing($entityID, $recyclingEntityID); $this->suspendObservers($entityID, $recyclingEntityID); $this->suspendWaitings($entityID, $recyclingEntityID); $this->suspendChats($entityID, $recyclingEntityID); $this->suspendProductRows($entityID, $recyclingEntityID); $this->suspendScoringHistory($entityID, $recyclingEntityID); //region Relations foreach($relations as $relation) { /** @var Relation $relation */ $relation->setRecycleBinID(\CCrmOwnerType::Lead, $entityID, $recyclingEntityID); $relation->save(); } LeadRelationManager::getInstance()->registerRecycleBin($recyclingEntityID, $entityID, $slots); //endregion } /** * Recover entity from Recycle Bin. * @param int $entityID Entity ID. * @param array $params Additional operation parameters. * @return bool * @throws Crm\Synchronization\UserFieldSynchronizationException * @throws Main\AccessDeniedException * @throws Main\ArgumentException * @throws Main\ArgumentOutOfRangeException * @throws Main\Db\SqlQueryException * @throws Main\InvalidOperationException * @throws Main\LoaderException * @throws Main\ObjectException * @throws Main\ObjectNotFoundException * @throws Main\SystemException */ public function recover($entityID, array $params = array()) { if($entityID <= 0) { return false; } $recyclingEntityID = isset($params['ID']) ? (int)$params['ID'] : 0; if($recyclingEntityID <= 0) { return false; } $slots = isset($params['SLOTS']) ? $params['SLOTS'] : null; if(!is_array($slots)) { return false; } $fields = isset($slots['FIELDS']) ? $slots['FIELDS'] : null; if(!(is_array($fields) && !empty($fields))) { return false; } unset($fields['ID'], $fields['COMPANY_ID'], $fields['CONTACT_ID'], $fields['CONTACT_IDS']); $relationMap = RelationMap::createByEntity(\CCrmOwnerType::Lead, $entityID, $recyclingEntityID); $relationMap->build(); LeadRelationManager::getInstance()->prepareRecoveryFields($fields, $relationMap); /* $contactIDs = isset($slots['CONTACT_IDS']) ? $slots['CONTACT_IDS'] : null; if(is_array($contactIDs) && !empty($contactIDs)) { $fields['CONTACT_IDS'] = $contactIDs; } */ //region Convert User Fields from Suspended Type $userFields = $this->prepareRestoredUserFields($recyclingEntityID); if(!empty($userFields)) { $fields = array_merge($fields, $userFields); } //endregion $entity = new \CCrmLead(false); $newEntityID = $entity->Add( $fields, true, array( 'IS_RESTORATION' => true, 'DISABLE_USER_FIELD_CHECK' => true ) ); if($newEntityID <= 0) { return false; } //region Relation LeadRelationManager::getInstance()->recoverBindings($newEntityID, $relationMap); Relation::updateEntityID(\CCrmOwnerType::Lead, $entityID, $newEntityID, $recyclingEntityID); //endregion $this->eraseSuspendedUserFields($recyclingEntityID); $this->recoverMultiFields($recyclingEntityID, $newEntityID); $this->recoverAddresses($recyclingEntityID, $newEntityID); $this->recoverTimeline($recyclingEntityID, $newEntityID); $this->recoverDocuments($recyclingEntityID, $newEntityID); $this->recoverLiveFeed($recyclingEntityID, $newEntityID); $this->recoverUtm($recyclingEntityID, $newEntityID); $this->recoverTracing($recyclingEntityID, $newEntityID); $this->recoverObservers($recyclingEntityID, $newEntityID); $this->recoverWaitings($recyclingEntityID, $newEntityID); $this->recoverChats($recyclingEntityID, $newEntityID); $this->recoverProductRows($recyclingEntityID, $newEntityID); $this->recoverScoringHistory($recyclingEntityID, $newEntityID); $this->recoverActivities($recyclingEntityID, $entityID, $newEntityID, $params, $relationMap); //region Relation Relation::unregisterRecycleBin($recyclingEntityID); Relation::deleteJunks(); //endregion $this->rebuildSearchIndex($newEntityID); $this->startRecoveryWorkflows($newEntityID); return true; } /** * Recover entity multifields. * @param int $recyclingEntityID Recycle Bin Entity ID. * @param int $newEntityID New Entity ID. * @throws Main\ArgumentException */ protected function recoverMultiFields($recyclingEntityID, $newEntityID) { $this->innerRecoverMultiFields($recyclingEntityID, $newEntityID); \CCrmLead::SynchronizeMultifieldMarkers($newEntityID); } /** * Erase entity from Recycle Bin. * @param int $entityID Entity ID. * @param array $params Additional operation parameters. * @return void * @throws Main\AccessDeniedException * @throws Main\ArgumentException * @throws Main\ArgumentOutOfRangeException * @throws Main\InvalidOperationException * @throws Main\LoaderException */ public function erase($entityID, array $params = array()) { if($entityID <= 0) { throw new Main\ArgumentException('Must be greater than zero.', 'entityID'); } $recyclingEntityID = isset($params['ID']) ? (int)$params['ID'] : 0; if($recyclingEntityID <= 0) { throw new Main\ArgumentException('Could not find parameter named: "ID".', 'params'); } /* $slots = isset($params['SLOTS']) ? $params['SLOTS'] : null; if(is_array($slots)) { } */ $relationMap = RelationMap::createByEntity(\CCrmOwnerType::Lead, $entityID, $recyclingEntityID); $relationMap->build(); $this->eraseActivities($recyclingEntityID, $params, $relationMap); $this->eraseSuspendedMultiFields($recyclingEntityID); $this->eraseSuspendedAddresses($recyclingEntityID, array(Crm\EntityAddress::Primary)); $this->eraseSuspendedTimeline($recyclingEntityID); $this->eraseSuspendedDocuments($recyclingEntityID); $this->eraseSuspendedLiveFeed($recyclingEntityID); $this->eraseSuspendedUtm($recyclingEntityID); $this->eraseSuspendedTracing($recyclingEntityID); $this->eraseSuspendedObservers($recyclingEntityID); $this->eraseSuspendedWaitings($recyclingEntityID); $this->eraseSuspendedChats($recyclingEntityID); $this->eraseSuspendProductRows($recyclingEntityID); $this->eraseSuspendedUserFields($recyclingEntityID); $this->eraseSuspendedScoringHistory($recyclingEntityID); Relation::deleteByRecycleBin($recyclingEntityID); } }
| ver. 1.4 |
Github
|
.
| PHP 7.4.8 | Генерация страницы: 0 |
proxy
|
phpinfo
|
Настройка