Your IP : 18.226.185.28


Current Path : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/crm.lead.list/
Upload File :
Current File : /home/bitrix/ext_www/crm.klimatlend.ua/bitrix/components/bitrix/crm.lead.list/list.ajax.php

<?
define('STOP_STATISTICS', true);
define('BX_SECURITY_SHOW_MESSAGE', true);
define('NO_KEEP_STATISTIC', 'Y');
define('NO_AGENT_STATISTIC','Y');
define('DisableEventsCheck', true);

$action = isset($_REQUEST['ACTION']) ? $_REQUEST['ACTION'] : '';
/**
 * AGENTS ARE REQUIRED FOR FOLLOWING ACTIONS:
 * 	REBUILD SEARCH INDEX
 * 	BUILD TIMELINE
 */
define(
	'NO_AGENT_CHECK',
	!in_array($action, array('REBUILD_SEARCH_CONTENT', 'BUILD_TIMELINE', 'REFRESH_ACCOUNTING', 'REBUILD_SEMANTICS', 'REBUILD_CONVERSION_STATISTICS'), true)
);

require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
global $DB, $APPLICATION;
if(!function_exists('__CrmLeadListEndResponse'))
{
	function __CrmLeadListEndResponse($result)
	{
		$GLOBALS['APPLICATION']->RestartBuffer();
		Header('Content-Type: application/x-javascript; charset='.LANG_CHARSET);
		if(!empty($result))
		{
			echo CUtil::PhpToJSObject($result);
		}
		require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/epilog_after.php');
		die();
	}
}

if (!CModule::IncludeModule('crm'))
{
	__CrmLeadListEndResponse(array('ERROR' => 'Could not include crm module.'));
}

use Bitrix\Crm\Conversion\LeadConversionType;
use Bitrix\Crm\Conversion\LeadConversionConfig;
use Bitrix\Crm\Conversion\LeadConversionWizard;
use Bitrix\Crm\Conversion\EntityConversionException;
use Bitrix\Crm\Synchronization\UserFieldSynchronizer;

$userPerms = CCrmPerms::GetCurrentUserPermissions();
if(!CCrmPerms::IsAuthorized())
{
	__CrmLeadListEndResponse(array('ERROR' => 'Access denied.'));
}

if (isset($_REQUEST['MODE']) && $_REQUEST['MODE'] === 'SEARCH')
{
	\Bitrix\Main\Localization\Loc::loadMessages(__FILE__);

	if(!CCrmLead::CheckReadPermission(0, $userPerms))
	{
		__CrmLeadListEndResponse(array('ERROR' => 'Access denied.'));
	}

	CUtil::JSPostUnescape();
	$APPLICATION->RestartBuffer();

	// Limit count of items to be found
	$nPageTop = 50;		// 50 items by default
	if (isset($_REQUEST['LIMIT_COUNT']) && ($_REQUEST['LIMIT_COUNT'] >= 0))
	{
		$rawNPageTop = (int) $_REQUEST['LIMIT_COUNT'];
		if ($rawNPageTop === 0)
			$nPageTop = false;		// don't limit
		elseif ($rawNPageTop > 0)
			$nPageTop = $rawNPageTop;
	}

	$arData = array();
	$search = trim($_REQUEST['VALUE']);
	if (!empty($search))
	{
		$multi = isset($_REQUEST['MULTI']) && $_REQUEST['MULTI'] == 'Y' ? true : false;
		$arFilter = array();
		if (is_numeric($search))
		{
			$arFilter['ID'] = (int)$search;
			$arFilter['%TITLE'] = $search;
			$arFilter['LOGIC'] = 'OR';
		}
		else if (preg_match('/(.*)\[(\d+?)\]/i' . BX_UTF_PCRE_MODIFIER, $search, $arMatches))
		{
			$arFilter['ID'] = (int)$arMatches[2];
			$searchString = trim($arMatches[1]);
			if (is_string($searchString) && $searchString !== '')
			{
				$arFilter['%TITLE'] = $searchString;
				$arFilter['%FULL_NAME'] = $searchString;
				$arFilter['LOGIC'] = 'OR';
			}
			unset($searchString);
		}
		else
		{
			$arFilter['%TITLE'] = trim($search);
			$arFilter['%FULL_NAME'] = trim($search);
			$arFilter['LOGIC'] = 'OR';
		}

		$arSelect = array('ID', 'TITLE', 'HONORIFIC', 'NAME', 'SECOND_NAME', 'LAST_NAME', 'STATUS_ID');
		$arOrder = array('TITLE' => 'ASC');
		$obRes = CCrmLead::GetListEx($arOrder, $arFilter, false, array('nTopCount' => $nPageTop), $arSelect);
		$arFiles = array();
		$i = 0;
		$leadIndex = array();
		while ($arRes = $obRes->Fetch())
		{
			$arData[$i] =
				array(
					'id' => $multi ? 'L_' . $arRes['ID'] : $arRes['ID'],
					'url' => CComponentEngine::MakePathFromTemplate(COption::GetOptionString('crm', 'path_to_lead_show'),
						array(
							'lead_id' => $arRes['ID']
						)
					),
					'title' => (str_replace(array(';', ','), ' ', $arRes['TITLE'])),
					'desc' => CCrmLead::PrepareFormattedName(
						array(
							'HONORIFIC' => isset($arRes['HONORIFIC']) ? $arRes['HONORIFIC'] : '',
							'NAME' => isset($arRes['NAME']) ? $arRes['NAME'] : '',
							'SECOND_NAME' => isset($arRes['SECOND_NAME']) ? $arRes['SECOND_NAME'] : '',
							'LAST_NAME' => isset($arRes['LAST_NAME']) ? $arRes['LAST_NAME'] : ''
						)
					),
					'type' => 'lead'
				);
			$leadIndex[$arRes['ID']] = &$arData[$i];
			$i++;
		}

		// advanced info - phone number, e-mail
		$obRes = CCrmFieldMulti::GetList(array('ID' => 'asc'), array('ENTITY_ID' => 'LEAD', 'ELEMENT_ID' => array_keys($leadIndex)));
		while ($arRes = $obRes->Fetch())
		{
			if (isset($leadIndex[$arRes['ELEMENT_ID']])
				&& ($arRes['TYPE_ID'] === 'PHONE' || $arRes['TYPE_ID'] === 'EMAIL'))
			{
				$item = &$leadIndex[$arRes['ELEMENT_ID']];
				if (!is_array($item['advancedInfo']))
					$item['advancedInfo'] = array();
				if (!is_array($item['advancedInfo']['multiFields']))
					$item['advancedInfo']['multiFields'] = array();
				$item['advancedInfo']['multiFields'][] = array(
					'ID' => $arRes['ID'],
					'TYPE_ID' => $arRes['TYPE_ID'],
					'VALUE_TYPE' => $arRes['VALUE_TYPE'],
					'VALUE' => $arRes['VALUE']
				);
				unset($item);
			}
		}
		unset($leadIndex);
	}

	__CrmLeadListEndResponse($arData);
}
elseif ($action === 'REBUILD_SEARCH_CONTENT')
{
	$agent = \Bitrix\Crm\Agent\Search\LeadSearchContentRebuildAgent::getInstance();
	if($agent->isEnabled() && !$agent->isActive())
	{
		$agent->enable(false);
	}
	if(!$agent->isEnabled())
	{
		__CrmLeadListEndResponse(array('STATUS' => 'COMPLETED'));
	}

	$progressData = $agent->getProgressData();
	__CrmLeadListEndResponse(
		array(
			'STATUS' => 'PROGRESS',
			'PROCESSED_ITEMS' => $progressData['PROCESSED_ITEMS'],
			'TOTAL_ITEMS' => $progressData['TOTAL_ITEMS'],
		)
	);
}
elseif ($action === 'REFRESH_ACCOUNTING')
{
	$agent = \Bitrix\Crm\Agent\Accounting\LeadAccountSyncAgent::getInstance();
	if($agent->isEnabled() && !$agent->isRegistered())
	{
		$agent->enable(false);
	}
	if(!$agent->isEnabled())
	{
		__CrmLeadListEndResponse(array('STATUS' => 'COMPLETED'));
	}

	$progressData = $agent->getProgressData();
	__CrmLeadListEndResponse(
		array(
			'STATUS' => 'PROGRESS',
			'PROCESSED_ITEMS' => $progressData['PROCESSED_ITEMS'],
			'TOTAL_ITEMS' => $progressData['TOTAL_ITEMS'],
		)
	);
}
elseif ($action === 'BUILD_TIMELINE')
{
	$agent = \Bitrix\Crm\Agent\Timeline\LeadTimelineBuildAgent::getInstance();
	if($agent->isEnabled() && !$agent->isActive())
	{
		$agent->enable(false);
	}
	if(!$agent->isEnabled())
	{
		__CrmLeadListEndResponse(array('STATUS' => 'COMPLETED'));
	}

	$progressData = $agent->getProgressData();
	__CrmLeadListEndResponse(
		array(
			'STATUS' => 'PROGRESS',
			'PROCESSED_ITEMS' => $progressData['PROCESSED_ITEMS'],
			'TOTAL_ITEMS' => $progressData['TOTAL_ITEMS'],
		)
	);
}
elseif ($action === 'SAVE_PROGRESS')
{
	$ID = isset($_REQUEST['ID']) ? intval($_REQUEST['ID']) : 0;
	$typeName = isset($_REQUEST['TYPE']) ? $_REQUEST['TYPE'] : '';
	$statusID = isset($_REQUEST['VALUE']) ? $_REQUEST['VALUE'] : '';

	$targetTypeName = CCrmOwnerType::ResolveName(CCrmOwnerType::Lead);
	if($statusID === '' || $ID <= 0  || $typeName !== $targetTypeName)
	{
		$APPLICATION->RestartBuffer();
		echo CUtil::PhpToJSObject(
			array('ERROR' => 'Invalid data!')
		);
		die();
	}

	$entityAttrs = $userPerms->GetEntityAttr($targetTypeName, array($ID));
	if (!$userPerms->CheckEnityAccess($targetTypeName, 'WRITE', $entityAttrs[$ID]))
	{
		$APPLICATION->RestartBuffer();
		echo CUtil::PhpToJSObject(
			array('ERROR' => 'Access denied!')
		);
		die();
	}

	$arPreviousFields = CCrmLead::GetByID($ID, false);

	if(!is_array($arPreviousFields))
	{
		$APPLICATION->RestartBuffer();
		echo CUtil::PhpToJSObject(
			array('ERROR' => 'Not found!')
		);
		die();
	}

	if(isset($arPreviousFields['STATUS_ID']) && $arPreviousFields['STATUS_ID'] === $statusID)
	{
		__CrmLeadListEndResponse(array('TYPE' => $targetTypeName, 'ID' => $ID, 'VALUE' => $statusID));
	}

	$arFields = array('STATUS_ID' => $statusID);
	$CCrmLead = new CCrmLead(false);
	if($CCrmLead->Update(
		$ID,
		$arFields,
		true,
		true,
		array(/*'DISABLE_USER_FIELD_CHECK' => true,*/ 'REGISTER_SONET_EVENT' => true))
	)
	{
		$arErrors = array();
		CCrmBizProcHelper::AutoStartWorkflows(
			CCrmOwnerType::Lead,
			$ID,
			CCrmBizProcEventType::Edit,
			$arErrors
		);

		//Region automation
		$starter = new \Bitrix\Crm\Automation\Starter(\CCrmOwnerType::Lead, $ID);
		$starter->setUserIdFromCurrent()->runOnUpdate($arFields, []);
		//end region

		__CrmLeadListEndResponse(array('TYPE' => $targetTypeName, 'ID' => $ID, 'VALUE' => $statusID));
	}
	else
	{
		$checkExceptions = $CCrmLead->GetCheckExceptions();
		$errorMessage = $entity->LAST_ERROR;
		$responseData = array(
			'TYPE' => CCrmOwnerType::LeadName,
			'ID' => $ID,
			'VALUE' => isset($arPreviousFields['STATUS_ID']) ? $arPreviousFields['STATUS_ID'] : ''
		);
		if(!empty($checkExceptions))
		{
			$checkErrors = array();
			foreach($checkExceptions as $exception)
			{
				if($exception instanceof \CAdminException)
				{
					foreach($exception->GetMessages() as $message)
					{
						$checkErrors[$message['id']] = $message['text'];
					}
				}
			}
			$responseData['CHECK_ERRORS'] = $checkErrors;
			$responseData['CONTEXT'] = array('STATUS_ID' => $statusID);
		}

		__CrmLeadListEndResponse($responseData);
	}

	__CrmLeadListEndResponse(array('TYPE' => $targetTypeName, 'ID' => $ID, 'VALUE' => $statusID));
}
elseif ($action === 'REBUILD_DUPLICATE_INDEX')
{
	\Bitrix\Main\Localization\Loc::loadMessages(__FILE__);

	$params = isset($_POST['PARAMS']) && is_array($_POST['PARAMS']) ? $_POST['PARAMS'] : array();
	$entityTypeName = isset($params['ENTITY_TYPE_NAME']) ? $params['ENTITY_TYPE_NAME'] : '';
	if($entityTypeName === '')
	{
		__CrmLeadListEndResponse(array('ERROR' => 'Entity type is not specified.'));
	}

	$entityTypeID = CCrmOwnerType::ResolveID($entityTypeName);
	if($entityTypeID === CCrmOwnerType::Undefined)
	{
		__CrmLeadListEndResponse(array('ERROR' => 'Undefined entity type is specified.'));
	}

	if($entityTypeID !== CCrmOwnerType::Lead)
	{
		__CrmLeadListEndResponse(array('ERROR' => "The '{$entityTypeName}' type is not supported in current context."));
	}

	if(!CCrmLead::CheckUpdatePermission(0))
	{
		__CrmLeadListEndResponse(array('ERROR' => 'Access denied.'));
	}

	if(COption::GetOptionString('crm', '~CRM_REBUILD_LEAD_DUP_INDEX', 'N') !== 'Y')
	{
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'NOT_REQUIRED',
				'SUMMARY' => GetMessage('CRM_LEAD_LIST_REBUILD_DUPLICATE_INDEX_NOT_REQUIRED_SUMMARY')
			)
		);
	}

	$progressData = COption::GetOptionString('crm', '~CRM_REBUILD_LEAD_DUP_INDEX_PROGRESS',  '');
	$progressData = $progressData !== '' ? unserialize($progressData) : array();

	if(empty($progressData) && intval(\Bitrix\Crm\BusinessTypeTable::getCount()) === 0)
	{
		//Try to fill BusinessTypeTable on first iteration
		\Bitrix\Crm\BusinessTypeTable::installDefault();
	}

	$lastItemID = isset($progressData['LAST_ITEM_ID']) ? intval($progressData['LAST_ITEM_ID']) : 0;
	$processedItemQty = isset($progressData['PROCESSED_ITEMS']) ? intval($progressData['PROCESSED_ITEMS']) : 0;
	$totalItemQty = isset($progressData['TOTAL_ITEMS']) ? intval($progressData['TOTAL_ITEMS']) : 0;
	if($totalItemQty <= 0)
	{
		$totalItemQty = CCrmLead::GetListEx(array(), array('CHECK_PERMISSIONS' => 'N'), array(), false);
	}

	$filter = array('CHECK_PERMISSIONS' => 'N');
	if($lastItemID > 0)
	{
		$filter['>ID'] = $lastItemID;
	}

	$dbResult = CCrmLead::GetListEx(
		array('ID' => 'ASC'),
		$filter,
		false,
		array('nTopCount' => 100),
		array('ID')
	);

	$itemIDs = array();
	$itemQty = 0;
	if(is_object($dbResult))
	{
		while($fields = $dbResult->Fetch())
		{
			$itemIDs[] = intval($fields['ID']);
			$itemQty++;
		}
	}

	if($itemQty > 0)
	{
		CCrmLead::RebuildDuplicateIndex($itemIDs);

		$progressData['TOTAL_ITEMS'] = $totalItemQty;
		$processedItemQty += $itemQty;
		$progressData['PROCESSED_ITEMS'] = $processedItemQty;
		$progressData['LAST_ITEM_ID'] = $itemIDs[$itemQty - 1];

		COption::SetOptionString('crm', '~CRM_REBUILD_LEAD_DUP_INDEX_PROGRESS', serialize($progressData));
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'PROGRESS',
				'PROCESSED_ITEMS' => $processedItemQty,
				'TOTAL_ITEMS' => $totalItemQty,
				'SUMMARY' => GetMessage(
					'CRM_LEAD_LIST_REBUILD_DUPLICATE_INDEX_PROGRESS_SUMMARY',
					array(
						'#PROCESSED_ITEMS#' => $processedItemQty,
						'#TOTAL_ITEMS#' => $totalItemQty
					)
				)
			)
		);
	}
	else
	{
		COption::RemoveOption('crm', '~CRM_REBUILD_LEAD_DUP_INDEX');
		COption::RemoveOption('crm', '~CRM_REBUILD_LEAD_DUP_INDEX_PROGRESS');
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'COMPLETED',
				'PROCESSED_ITEMS' => $processedItemQty,
				'TOTAL_ITEMS' => $totalItemQty,
				'SUMMARY' => GetMessage(
					'CRM_LEAD_LIST_REBUILD_DUPLICATE_INDEX_COMPLETED_SUMMARY',
					array('#PROCESSED_ITEMS#' => $processedItemQty)
				)
			)
		);
	}
}
elseif ($action === 'REBUILD_STATISTICS')
{
	//~CRM_REBUILD_LEAD_STATISTICS
	\Bitrix\Main\Localization\Loc::loadMessages(__FILE__);

	if(!CCrmLead::CheckUpdatePermission(0))
	{
		__CrmLeadListEndResponse(array('ERROR' => 'Access denied.'));
	}

	if(COption::GetOptionString('crm', '~CRM_REBUILD_LEAD_STATISTICS', 'N') !== 'Y')
	{
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'NOT_REQUIRED',
				'SUMMARY' => GetMessage('CRM_LEAD_LIST_REBUILD_STATISTICS_NOT_REQUIRED_SUMMARY')
			)
		);
	}

	$progressData = COption::GetOptionString('crm', '~CRM_REBUILD_LEAD_STATISTICS_PROGRESS',  '');
	$progressData = $progressData !== '' ? unserialize($progressData) : array();
	$lastItemID = isset($progressData['LAST_ITEM_ID']) ? intval($progressData['LAST_ITEM_ID']) : 0;
	$processedItemQty = isset($progressData['PROCESSED_ITEMS']) ? intval($progressData['PROCESSED_ITEMS']) : 0;
	$totalItemQty = isset($progressData['TOTAL_ITEMS']) ? intval($progressData['TOTAL_ITEMS']) : 0;
	if($totalItemQty <= 0)
	{
		$totalItemQty = CCrmLead::GetListEx(array(), array('CHECK_PERMISSIONS' => 'N'), array(), false);
	}

	$filter = array('CHECK_PERMISSIONS' => 'N');
	if($lastItemID > 0)
	{
		$filter['>ID'] = $lastItemID;
	}

	$dbResult = CCrmLead::GetListEx(
		array('ID' => 'ASC'),
		$filter,
		false,
		array('nTopCount' => 200),
		array('ID')
	);

	$itemIDs = array();
	$itemQty = 0;
	if(is_object($dbResult))
	{
		while($fields = $dbResult->Fetch())
		{
			$itemIDs[] = (int)$fields['ID'];
			$itemQty++;
		}
	}

	if($itemQty > 0)
	{
		CCrmLead::RebuildStatistics($itemIDs);

		$progressData['TOTAL_ITEMS'] = $totalItemQty;
		$processedItemQty += $itemQty;
		$progressData['PROCESSED_ITEMS'] = $processedItemQty;
		$progressData['LAST_ITEM_ID'] = $itemIDs[$itemQty - 1];

		COption::SetOptionString('crm', '~CRM_REBUILD_LEAD_STATISTICS_PROGRESS', serialize($progressData));
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'PROGRESS',
				'PROCESSED_ITEMS' => $processedItemQty,
				'TOTAL_ITEMS' => $totalItemQty,
				'SUMMARY' => GetMessage(
					'CRM_LEAD_LIST_REBUILD_STATISTICS_PROGRESS_SUMMARY',
					array(
						'#PROCESSED_ITEMS#' => $processedItemQty,
						'#TOTAL_ITEMS#' => $totalItemQty
					)
				)
			)
		);
	}
	else
	{
		COption::RemoveOption('crm', '~CRM_REBUILD_LEAD_STATISTICS');
		COption::RemoveOption('crm', '~CRM_REBUILD_LEAD_STATISTICS_PROGRESS');
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'COMPLETED',
				'PROCESSED_ITEMS' => $processedItemQty,
				'TOTAL_ITEMS' => $totalItemQty,
				'SUMMARY' => GetMessage(
					'CRM_LEAD_LIST_REBUILD_STATISTICS_COMPLETED_SUMMARY',
					array('#PROCESSED_ITEMS#' => $processedItemQty)
				)
			)
		);
	}
}
elseif ($action === 'REBUILD_SUM_STATISTICS')
{
	//~CRM_REBUILD_LEAD_SUM_STATISTICS
	\Bitrix\Main\Localization\Loc::loadMessages(__FILE__);

	if(!CCrmLead::CheckUpdatePermission(0))
	{
		__CrmLeadListEndResponse(array('ERROR' => 'Access denied.'));
	}

	if(COption::GetOptionString('crm', '~CRM_REBUILD_LEAD_SUM_STATISTICS', 'N') !== 'Y')
	{
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'NOT_REQUIRED',
				'SUMMARY' => GetMessage('CRM_LEAD_LIST_REBUILD_STATISTICS_NOT_REQUIRED_SUMMARY')
			)
		);
	}

	$progressData = COption::GetOptionString('crm', '~CRM_REBUILD_LEAD_SUM_STATISTICS_PROGRESS',  '');
	$progressData = $progressData !== '' ? unserialize($progressData) : array();
	$lastItemID = isset($progressData['LAST_ITEM_ID']) ? intval($progressData['LAST_ITEM_ID']) : 0;
	$processedItemQty = isset($progressData['PROCESSED_ITEMS']) ? intval($progressData['PROCESSED_ITEMS']) : 0;
	$totalItemQty = isset($progressData['TOTAL_ITEMS']) ? intval($progressData['TOTAL_ITEMS']) : 0;
	if($totalItemQty <= 0)
	{
		$totalItemQty = CCrmLead::GetListEx(array(), array('CHECK_PERMISSIONS' => 'N'), array(), false);
	}

	$filter = array('CHECK_PERMISSIONS' => 'N');
	if($lastItemID > 0)
	{
		$filter['>ID'] = $lastItemID;
	}

	$dbResult = CCrmLead::GetListEx(
		array('ID' => 'ASC'),
		$filter,
		false,
		array('nTopCount' => 20),
		array('ID')
	);

	$itemIDs = array();
	$itemQty = 0;
	if(is_object($dbResult))
	{
		while($fields = $dbResult->Fetch())
		{
			$itemIDs[] = (int)$fields['ID'];
			$itemQty++;
		}
	}

	if($itemQty > 0)
	{
		CCrmLead::RebuildStatistics(
			$itemIDs,
			array(
				'FORCED' => true,
				'ENABLE_SUM_STATISTICS' => true,
				'ENABLE_HISTORY'=> false,
				'ENABLE_ACTIVITY_STATISTICS' => false
			)
		);

		$progressData['TOTAL_ITEMS'] = $totalItemQty;
		$processedItemQty += $itemQty;
		$progressData['PROCESSED_ITEMS'] = $processedItemQty;
		$progressData['LAST_ITEM_ID'] = $itemIDs[$itemQty - 1];

		COption::SetOptionString('crm', '~CRM_REBUILD_LEAD_SUM_STATISTICS_PROGRESS', serialize($progressData));
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'PROGRESS',
				'PROCESSED_ITEMS' => $processedItemQty,
				'TOTAL_ITEMS' => $totalItemQty,
				'SUMMARY' => GetMessage(
					'CRM_LEAD_LIST_REBUILD_STATISTICS_PROGRESS_SUMMARY',
					array(
						'#PROCESSED_ITEMS#' => $processedItemQty,
						'#TOTAL_ITEMS#' => $totalItemQty
					)
				)
			)
		);
	}
	else
	{
		COption::RemoveOption('crm', '~CRM_REBUILD_LEAD_SUM_STATISTICS');
		COption::RemoveOption('crm', '~CRM_REBUILD_LEAD_SUM_STATISTICS_PROGRESS');
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'COMPLETED',
				'PROCESSED_ITEMS' => $processedItemQty,
				'TOTAL_ITEMS' => $totalItemQty,
				'SUMMARY' => GetMessage(
					'CRM_LEAD_LIST_REBUILD_STATISTICS_COMPLETED_SUMMARY',
					array('#PROCESSED_ITEMS#' => $processedItemQty)
				)
			)
		);
	}
}
elseif ($action === 'REBUILD_CONVERSION_STATISTICS')
{
	$agent = \Bitrix\Crm\Agent\Statistics\LeadConversionStatisticsRebuildAgent::getInstance();
	if($agent->isEnabled() && !$agent->isRegistered())
	{
		$agent->enable(false);
	}
	if(!$agent->isEnabled())
	{
		__CrmLeadListEndResponse(array('STATUS' => 'COMPLETED'));
	}

	$progressData = $agent->getProgressData();
	__CrmLeadListEndResponse(
		array(
			'STATUS' => 'PROGRESS',
			'PROCESSED_ITEMS' => $progressData['PROCESSED_ITEMS'],
			'TOTAL_ITEMS' => $progressData['TOTAL_ITEMS']
		)
	);
}
elseif ($action === 'REBUILD_SEMANTICS')
{
	$agent = \Bitrix\Crm\Agent\Semantics\LeadSemanticsRebuildAgent::getInstance();
	if($agent->isEnabled() && !$agent->isRegistered())
	{
		$agent->enable(false);
	}
	if(!$agent->isEnabled())
	{
		__CrmLeadListEndResponse(array('STATUS' => 'COMPLETED'));
	}

	$progressData = $agent->getProgressData();
	__CrmLeadListEndResponse(
		array(
			'STATUS' => 'PROGRESS',
			'PROCESSED_ITEMS' => $progressData['PROCESSED_ITEMS'],
			'TOTAL_ITEMS' => $progressData['TOTAL_ITEMS']
		)
	);
}
elseif ($action === 'GET_ROW_COUNT')
{
	\Bitrix\Main\Localization\Loc::loadMessages(__FILE__);

	if(!CCrmLead::CheckReadPermission(0, $userPerms))
	{
		__CrmLeadListEndResponse(array('ERROR' => 'Access denied.'));
	}

	$params = isset($_REQUEST['PARAMS']) && is_array($_REQUEST['PARAMS']) ? $_REQUEST['PARAMS'] : array();
	$gridID = isset($params['GRID_ID']) ? $params['GRID_ID'] : '';
	if(!($gridID !== ''
		&& isset($_SESSION['CRM_GRID_DATA'])
		&& isset($_SESSION['CRM_GRID_DATA'][$gridID])
		&& is_array($_SESSION['CRM_GRID_DATA'][$gridID])))
	{
		__CrmLeadListEndResponse(array('DATA' => array('TEXT' => '')));
	}

	$gridData = $_SESSION['CRM_GRID_DATA'][$gridID];
	$filter = isset($gridData['FILTER']) && is_array($gridData['FILTER']) ? $gridData['FILTER'] : array();
	$result = CCrmLead::GetListEx(array(), $filter, array(), false, array(), array());

	$text = '';
	if(is_numeric($result))
	{
		$text = GetMessage('CRM_LEAD_LIST_ROW_COUNT', array('#ROW_COUNT#' => $result));
		if($text === '')
		{
			$text = $result;
		}
	}
	__CrmLeadListEndResponse(array('DATA' => array('TEXT' => $text)));
}
elseif ($action === 'DELETE')
{
	\Bitrix\Main\Localization\Loc::loadMessages(__FILE__);

	if(!CCrmLead::CheckDeletePermission(0, $userPerms))
	{
		__CrmLeadListEndResponse(array('ERROR' => GetMessage('CRM_LEAD_LIST_DELETION_ACCESS_ERROR')));
	}

	$params = isset($_POST['PARAMS']) && is_array($_POST['PARAMS']) ? $_POST['PARAMS'] : array();
	$entityTypeName = isset($params['ENTITY_TYPE_NAME']) ? $params['ENTITY_TYPE_NAME'] : '';
	if($entityTypeName === '')
	{
		__CrmLeadListEndResponse(array('ERROR' => GetMessage('CRM_LEAD_LIST_DELETION_PARAM_ERROR')));
	}

	$entityTypeID = CCrmOwnerType::ResolveID($entityTypeName);
	if($entityTypeID === CCrmOwnerType::Undefined)
	{
		__CrmLeadListEndResponse(array('ERROR' => GetMessage('CRM_LEAD_LIST_DELETION_PARAM_ERROR')));
	}

	if($entityTypeID !== CCrmOwnerType::Lead)
	{
		__CrmLeadListEndResponse(array('ERROR' => GetMessage('CRM_LEAD_LIST_DELETION_PARAM_ERROR')));
	}

	$gridID = isset($params['GRID_ID']) ? $params['GRID_ID'] : '';
	if($gridID === '')
	{
		__CrmLeadListEndResponse(array('ERROR' => GetMessage('CRM_LEAD_LIST_DELETION_PARAM_ERROR')));
	}

	$contextID = isset($params['CONTEXT_ID']) ? $params['CONTEXT_ID'] : '';
	if($contextID === '')
	{
		__CrmLeadListEndResponse(array('ERROR' => GetMessage('CRM_LEAD_LIST_DELETION_PARAM_ERROR')));
	}

	$progressData = isset($_SESSION['CRM_LEAD_DELETE_PROGRESS'])
	&& isset($_SESSION['CRM_LEAD_DELETE_PROGRESS'][$contextID])
	&& is_array($_SESSION['CRM_LEAD_DELETE_PROGRESS'][$contextID])
		? $_SESSION['CRM_LEAD_DELETE_PROGRESS'][$contextID] : array();

	$lastItemID = isset($progressData['LAST_ITEM_ID']) ? $progressData['LAST_ITEM_ID'] : 0;
	$totalItemQty = 0;
	$processedItemQty = isset($progressData['PROCESSED_ITEMS']) ? $progressData['PROCESSED_ITEMS'] : 0;

	$processAll = isset($params['PROCESS_ALL']) && mb_strtoupper($params['PROCESS_ALL']) === 'Y';
	$slotLength = 5;
	$effectiveItemIDs = array();
	if(!$processAll)
	{
		$entityIDs = isset($params['ENTITY_IDS']) && is_array($params['ENTITY_IDS']) ? $params['ENTITY_IDS'] : array();
		if(empty($entityIDs))
		{
			__CrmLeadListEndResponse(array('ERROR' => 'Entity IDs are not specified.'));
		}
		$totalItemQty = count($entityIDs);

		sort($entityIDs, SORT_NUMERIC);
		$index = $lastItemID > 0 ? array_search($lastItemID, $entityIDs) : false;
		if(is_int($index) && $index >= 0)
		{
			$index++;
		}
		else
		{
			$index = 0;
		}

		$effectiveItemIDs = array_slice($entityIDs, $index, $slotLength);
		for($i = 0; $i < $slotLength; $i++)
		{
			if(!CCrmLead::CheckDeletePermission($effectiveItemIDs[$i], $userPerms))
			{
				unset($effectiveItemIDs[$i]);
			}
		}
	}
	else
	{
		$userFilterHash = isset($params['USER_FILTER_HASH']) ? $params['USER_FILTER_HASH'] : '';
		if($userFilterHash === '')
		{
			__CrmLeadListEndResponse(array('ERROR' => 'Filter hash is not specified.'));
		}

		$filter = \Bitrix\Crm\Context\GridContext::getFilter($gridID);
		$filterHash = \Bitrix\Crm\Context\GridContext::getFilterHash($gridID);

		if(!is_array($filter) || $filterHash === '')
		{
			__CrmLeadListEndResponse(array('ERROR' => GetMessage('CRM_LEAD_LIST_DELETION_FILTER_NOT_FOUND_ERROR')));
		}

		if($filterHash !== $userFilterHash)
		{
			__CrmLeadListEndResponse(array('ERROR' => GetMessage('CRM_LEAD_LIST_DELETION_FILTER_OUTDATED_ERROR')));
		}

		$totalItemQty = isset($progressData['TOTAL_ITEMS']) ? $progressData['TOTAL_ITEMS'] : 0;
		if($totalItemQty <= 0)
		{
			$totalItemQty = CCrmLead::GetListEx(array(), $filter, array(), false, array(), array());
		}

		if($lastItemID > 0)
		{
			$filter['>ID'] = $lastItemID;
		}

		$result = CCrmLead::GetListEx(
			array('ID' => 'ASC'),
			$filter,
			false,
			array('nTopCount' => $slotLength),
			array('ID')
		);

		if(is_object($result))
		{
			while($fields = $result->Fetch())
			{
				$itemID = (int)$fields['ID'];
				if(CCrmLead::CheckDeletePermission($itemID, $userPerms))
				{
					$effectiveItemIDs[] = $itemID;
				}
			}
		}
	}

	$entity = new CCrmLead(false);
	$bizProc = new CCrmBizProc(CCrmOwnerType::LeadName);
	$itemQty = 0;

	if(!empty($effectiveItemIDs))
	{
		foreach($effectiveItemIDs as $itemID)
		{
			$itemID = (int)$itemID;

			$bizProc->Delete($itemID, $userPerms->GetEntityAttr(CCrmOwnerType::LeadName, array($itemID)));
			$entity->Delete($itemID, array('CHECK_DEPENDENCIES' => true, 'PROCESS_BIZPROC' => false));

			$lastItemID = $itemID;
			$itemQty++;
		}
	}

	if($itemQty > 0)
	{
		$processedItemQty += $itemQty;
		$_SESSION['CRM_LEAD_DELETE_PROGRESS'][$contextID] = array(
			'LAST_ITEM_ID' => $lastItemID,
			'PROCESSED_ITEMS' => $processedItemQty,
			'TOTAL_ITEMS' => $totalItemQty
		);

		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'PROGRESS',
				'PROCESSED_ITEMS' => $processedItemQty,
				'TOTAL_ITEMS' => $totalItemQty,
				'SUMMARY' => GetMessage(
					'CRM_LEAD_LIST_DELETION_PROGRESS_SUMMARY',
					array(
						'#PROCESSED_ITEMS#' => $processedItemQty,
						'#TOTAL_ITEMS#' => $totalItemQty
					)
				)
			)
		);
	}
	else
	{
		__CrmLeadListEndResponse(
			array(
				'STATUS' => 'COMPLETED',
				'PROCESSED_ITEMS' => $processedItemQty,
				'TOTAL_ITEMS' => $totalItemQty,
				'SUMMARY' => GetMessage(
					'CRM_LEAD_LIST_DELETION_COMPLETED_SUMMARY',
					array('#PROCESSED_ITEMS#' => $processedItemQty)
				)
			)
		);
	}
}
elseif ($action === 'PREPARE_BATCH_CONVERSION')
{
	CUtil::JSPostUnescape();

	$params = isset($_REQUEST['PARAMS']) && is_array($_REQUEST['PARAMS']) ? $_REQUEST['PARAMS'] : array();
	$gridID = isset($params['GRID_ID']) ? $params['GRID_ID'] : '';
	$IDs = isset($params['IDS']) && is_array($params['IDS']) ? $params['IDS'] : array();
	$enableUserFieldCheck = !isset($params['ENABLE_USER_FIELD_CHECK'])
		|| mb_strtoupper($params['ENABLE_USER_FIELD_CHECK']) === 'Y';
	$enableConfigCheck = !isset($params['ENABLE_CONFIG_CHECK'])
		|| mb_strtoupper($params['ENABLE_CONFIG_CHECK']) === 'Y';

	$configParams = isset($params['CONFIG']) && is_array($params['CONFIG']) ? $params['CONFIG'] : array();
	$config = new \Bitrix\Crm\Conversion\LeadConversionConfig();
	$config->fromJavaScript($configParams);

	$progressData = array(
		'CONFIG' => $config->externalize(),
		'ENABLE_CONFIG_CHECK' => $enableConfigCheck,
		'ENABLE_USER_FIELD_CHECK' => $enableUserFieldCheck,
		'CURRENT_ENTITY_INDEX' => 0,
		'CURRENT_ENTITY_ID' => 0,
		'PROCESSED_ENTITIES' => 0
	);

	if(!empty($IDs))
	{
		$progressData['ENTITY_IDS'] = $IDs;
		$progressData['TOTAL_ENTITIES'] = count($IDs);
	}
	else
	{
		$filter = isset($params['FILTER']) && is_array($params['FILTER']) ? $params['FILTER'] : array();
		if(empty($filter))
		{
			$filterOptions = new \Bitrix\Main\UI\Filter\Options($gridID);
			$filter = $filterOptions->getFilter();
		}
		$progressData['FILTER'] = $filter;
		$progressData['TOTAL_ENTITIES'] = \CCrmLead::GetListEx(
			array(),
			$filter,
			array(),
			false
		);
	}

	if (!isset($_SESSION['CRM_LEAD_BATCH_CONVERSION_DATA']))
	{
		$_SESSION['CRM_LEAD_BATCH_CONVERSION_DATA'] = array();
	}
	$_SESSION['CRM_LEAD_BATCH_CONVERSION_DATA'][$gridID] = $progressData;

	$errors = array();
	$settings = \Bitrix\Crm\Settings\ConversionSettings::getCurrent();
	if (!$settings->isAutocreationEnabled())
	{
		$errors[] = GetMessage('CRM_LEAD_LIST_BATCH_CONVERSION_AUTOCREATION_DISABLED');
	}

	$needForSync = false;
	$entityConfigs = $config->getItems();
	$syncFieldNames = array();
	foreach ($entityConfigs as $entityTypeID => $entityConfig)
	{
		$entityTypeName = CCrmOwnerType::ResolveName($entityTypeID);
		if (!CCrmAuthorizationHelper::CheckCreatePermission($entityTypeName, $currentUserPermissions) && !CCrmAuthorizationHelper::CheckUpdatePermission($entityTypeName, 0, $currentUserPermissions))
		{
			continue;
		}

		$isActive = $entityConfig->isActive();

		if($isActive
			&& \CCrmBizProcHelper::HasParameterizedAutoWorkflows($entityTypeID, \CCrmBizProcEventType::Create)
		)
		{
			$ex = new EntityConversionException(
				\CCrmOwnerType::Lead,
				$entityTypeID,
				EntityConversionException::TARG_DST,
				EntityConversionException::HAS_WORKFLOWS
			);
			$errors[] = $ex->getLocalizedMessage();
		}

		$enableSync = $isActive;
		if ($enableSync)
		{
			$syncFields = UserFieldSynchronizer::getSynchronizationFields(CCrmOwnerType::Lead, $entityTypeID);
			$enableSync = !empty($syncFields);
			foreach ($syncFields as $field)
			{
				$syncFieldNames[$field['ID']] = UserFieldSynchronizer::getFieldLabel($field);
			}
		}

		if ($enableSync && !$needForSync)
		{
			$needForSync = true;
		}
		$entityConfig->enableSynchronization($enableSync);
	}

	$status = 'READY';
	if(!empty($errors))
	{
		$status = 'ERROR';
	}

	if($needForSync)
	{
		$status = 'REQUIRES_SYNCHRONIZATION';
	}

	__CrmLeadListEndResponse(
		array(
			'DATA' => array(
				'STATUS' => $status,
				'REQUIRES_SYNCHRONIZATION' => $needForSync,
				'CONFIG' => $config->toJavaScript(),
				'FIELD_NAMES' => array_values($syncFieldNames),
				'ERRORS' => $errors
			)
		)
	);
}
elseif ($action === 'STOP_BATCH_CONVERSION')
{
	$params = isset($_REQUEST['PARAMS']) && is_array($_REQUEST['PARAMS']) ? $_REQUEST['PARAMS'] : array();
	$gridID = isset($params['GRID_ID']) ? $params['GRID_ID'] : '';

	if($gridID !== '' && isset($_SESSION['CRM_LEAD_BATCH_CONVERSION_DATA']))
	{
		unset($_SESSION['CRM_LEAD_BATCH_CONVERSION_DATA'][$gridID]);
	}

	__CrmLeadListEndResponse(array('STATUS' => 'SUCCESS'));
}
elseif ($action === 'PROCESS_BATCH_CONVERSION')
{
	CUtil::JSPostUnescape();

	$params = isset($_REQUEST['PARAMS']) && is_array($_REQUEST['PARAMS']) ? $_REQUEST['PARAMS'] : array();
	$gridID = isset($params['GRID_ID']) ? $params['GRID_ID'] : '';
	$configParams = isset($params['CONFIG']) && is_array($params['CONFIG']) ? $params['CONFIG'] : array();
	$config = new LeadConversionConfig();
	$config->fromJavaScript($configParams);

	$progressData = isset($_SESSION['CRM_LEAD_BATCH_CONVERSION_DATA']) && isset($_SESSION['CRM_LEAD_BATCH_CONVERSION_DATA'][$gridID])
		? $_SESSION['CRM_LEAD_BATCH_CONVERSION_DATA'][$gridID] : null;

	if(!is_array($progressData))
	{
		__CrmLeadListEndResponse(array('STATE' => 'ERROR', 'ERROR' => 'NOT FOUND'));
	}

	$enableUserFieldCheck = isset($progressData['ENABLE_USER_FIELD_CHECK'])
		? (bool)$progressData['ENABLE_USER_FIELD_CHECK'] : true;

	$enableConfigCheck = isset($progressData['ENABLE_CONFIG_CHECK'])
		? (bool)$progressData['ENABLE_CONFIG_CHECK'] : true;

	$entityIDs = isset($progressData['ENTITY_IDS']) && is_array($progressData['ENTITY_IDS'])
		? $progressData['ENTITY_IDS'] : array();
	$filter = isset($progressData['FILTER']) && is_array($progressData['FILTER'])
		? $progressData['FILTER'] : array();

	$processedQty = isset($progressData['PROCESSED_ENTITIES']) ? (int)$progressData['PROCESSED_ENTITIES'] : 0;
	$entityQty = isset($progressData['TOTAL_ENTITIES']) ? (int)$progressData['TOTAL_ENTITIES'] : 0;

	$currentEntityIndex = isset($progressData['CURRENT_ENTITY_INDEX']) ? (int)$progressData['CURRENT_ENTITY_INDEX'] : 0;
	$currentEntityID = isset($progressData['CURRENT_ENTITY_ID']) ? (int)$progressData['CURRENT_ENTITY_ID'] : 0;

	if($currentEntityID <= 0)
	{
		if(!empty($entityIDs))
		{
			$currentEntityIndex = 0;
			$currentEntityID = $entityIDs[0];
		}
		else
		{
			$dbResult = \CCrmLead::GetListEx(
				array('ID' => 'ASC'),
				$filter,
				false,
				array('nTopCount' => 1),
				array('ID')
			);
			$fields = $dbResult->Fetch();
			if(is_array($fields))
			{
				$currentEntityID = (int)$fields['ID'];
			}
		}
	}

	$entityConfigs = $config->getItems();
	foreach($entityConfigs as $entityTypeID => $entityConfig)
	{
		$entityTypeName = CCrmOwnerType::ResolveName($entityTypeID);
		if(!CCrmAuthorizationHelper::CheckCreatePermission($entityTypeName, $currentUserPermissions)
			&& !CCrmAuthorizationHelper::CheckUpdatePermission($entityTypeName, 0, $currentUserPermissions))
		{
			continue;
		}

		if(!$entityConfig->isActive())
		{
			continue;
		}

		if(!UserFieldSynchronizer::needForSynchronization(CCrmOwnerType::Lead, $entityTypeID))
		{
			continue;
		}

		if($entityConfig->isSynchronizationEnabled())
		{
			UserFieldSynchronizer::synchronize(\CCrmOwnerType::Lead, $entityTypeID);
		}
		else
		{
			UserFieldSynchronizer::markAsSynchronized(\CCrmOwnerType::Lead, $entityTypeID);
		}
	}

	$config->setTypeID(LeadConversionType::resolveByEntityID($currentEntityID));
	if($enableConfigCheck && !$config->isSupported())
	{
		$errorText = GetMessage('CRM_LEAD_LIST_BATCH_CONVERSION_CONFIG_IS_NOT_SUPPORTED');
	}
	else
	{
		$wizard = new LeadConversionWizard($currentEntityID, $config);
		if(!$enableUserFieldCheck)
		{
			$wizard->enableUserFieldCheck(false);
		}

		$errorText = '';
		if(!$wizard->execute())
		{
			$errorText = $wizard->getErrorText();
			$wizard->undo();
		}
		LeadConversionWizard::remove($currentEntityID);
	}

	$processedQty++;

	$resultData = array(
		'PROCESSED_ITEMS' => $processedQty,
		'TOTAL_ITEMS' => $entityQty
	);

	if($errorText !== '')
	{
		CCrmOwnerType::TryGetEntityInfo(
			CCrmOwnerType::Lead,
			$currentEntityID,
			$entityInfo,
			false
		);

		$resultData['ERRORS'] = array(array('message' => $errorText, 'customData' => array('info' => $entityInfo)));
	}

	$isInProgress = true;
	if(!empty($entityIDs))
	{
		if($currentEntityIndex < ($entityQty - 1))
		{
			$currentEntityIndex++;
			$currentEntityID = $entityIDs[$currentEntityIndex];
		}
		else
		{
			$isInProgress = false;
		}
	}
	else
	{
		$filter['>ID'] = $currentEntityID;
		$dbResult = \CCrmLead::GetListEx(
			array('ID' => 'ASC'),
			$filter,
			false,
			array('nTopCount' => 1),
			array('ID')
		);
		$fields = $dbResult->Fetch();
		if(is_array($fields))
		{
			$currentEntityID = (int)$fields['ID'];
		}
		else
		{
			$isInProgress = false;
		}
	}
	$resultData['STATUS'] = $isInProgress ? 'PROGRESS' : 'COMPLETED';

	$progressData['PROCESSED_ENTITIES'] = $processedQty;
	$progressData['CURRENT_ENTITY_INDEX'] = $currentEntityIndex;
	$progressData['CURRENT_ENTITY_ID'] = $currentEntityID;

	$_SESSION['CRM_LEAD_BATCH_CONVERSION_DATA'][$gridID] = $progressData;

	__CrmLeadListEndResponse($resultData);
}
elseif ($action === 'CHECK_ACTIVE_LEAD')
{
	$existActiveLeads = 'N';

	$dbRes = \CCrmLead::GetListEx(array('DATE_CREATE' => 'desc'), array("STATUS_SEMANTIC_ID" => \Bitrix\Crm\PhaseSemantics::PROCESS), false, array("nPageSize" => 1), array("ID"));
	$dbRes->NavStart(1, false);
	if ($dbRes->GetNext())
	{
		$existActiveLeads = 'Y';
	}

	__CrmLeadListEndResponse(array('EXIST_LEADS' => $existActiveLeads));
}
?>