@elov4anin
Frontend developer

Групповая смена ответственного из сделки в контакте и компании в CRM Битрикс, коробочная версия?

Как я понимаю при назначении ответственного скрипт JS отправляет по AJAX параметры

rows[0]:17031 - номер сделки
rows[1]:17030 - номер сделки
controls[action_button_CRM_DEAL_LIST_V12]:assign_to - название действия
controls[ACTION_ASSIGNED_BY_SEARCH]: ФИО - фио ответственного
controls[ACTION_ASSIGNED_BY_ID]:34 - id ответственного в системе

POST http://адресс сайта/crm/deal/list/?sessid=ca344242967f7de9beefa7e4675b3cd0&internal=true&grid_id=CRM_DEAL_LIST_V12&grid_action=showpage&bxajaxid=a6527cffb462017dbf0dfa6a0e34cee3

Не могу понять какой файл php отвечает не посредственно за обработку данных параметров и смену ответственного
Просмотрел файлы PHP - bitrix/www/bitrix/components/bitrix/crm.deal.list - в поисках необходимого для модификации метода, но так и ничего похожего не нашел.

Так же проверил скрипты JS bitrix/www/bitrix/components/bitrix/main.ui.grid/templates/.default
  • Вопрос задан
  • 1664 просмотра
Решения вопроса 1
gromdron
@gromdron Куратор тега Битрикс24
Работаю с Bitrix24
Вы правильно нашли, за это отвечает компонент bitrix:crm.deal.list, который лежит в /bitrix/components/bitrix/crm.deal.list/component.php.
Код несколько запутанный, но работает следующим образом:

На ~614 сроке ( ~ 614 - 679 ) находится код, который парсит полученные данные и собирает их в массив $actionData
//region Try to extract user action data
// We have to extract them before call of CGridOptions::GetFilter() or the custom filter will be corrupted.
$actionData = array(
	'METHOD' => $_SERVER['REQUEST_METHOD'],
	'ACTIVE' => false
);

if(check_bitrix_sessid())
{
	$postAction = 'action_button_'.$arResult['GRID_ID'];
	$getAction = 'action_'.$arResult['GRID_ID'];
	//We need to check grid 'controls'
	$controls = isset($_POST['controls']) && is_array($_POST['controls']) ? $_POST['controls'] : array();
	if ($actionData['METHOD'] == 'POST' && (isset($controls[$postAction]) || isset($_POST[$postAction])))
	{
		CUtil::JSPostUnescape();

		$actionData['ACTIVE'] = true;

		if(isset($controls[$postAction]))
		{
			$actionData['NAME'] = $controls[$postAction];
		}
		else
		{
			$actionData['NAME'] = $_POST[$postAction];
			unset($_POST[$postAction], $_REQUEST[$postAction]);
		}
	...
	...
	...
		$actionData['AJAX_CALL'] = $arResult['IS_AJAX_CALL'];
	}
}
//endregion


А с ~915 строки начинается непосредственная обработка ( ~915 - 1457):

// POST & GET actions processing -->
if($actionData['ACTIVE'])
{
	if ($actionData['METHOD'] == 'POST')
	{
		if($actionData['NAME'] == 'delete')
		{
		...
		elseif($actionData['NAME'] == 'assign_to')
		{
			if(isset($actionData['ASSIGNED_BY_ID']))
			{
				$arIDs = array();
				if ($actionData['ALL_ROWS'])
				{
					$arActionFilter = $arFilter;
					$arActionFilter['CHECK_PERMISSIONS'] = 'N'; // Ignore 'WRITE' permission - we will check it before update.
					$dbRes = CCrmDeal::GetListEx(array(), $arActionFilter, false, false, array('ID'));
					while($arDeal = $dbRes->Fetch())
					{
						$arIDs[] = $arDeal['ID'];
					}
				}
				elseif (isset($actionData['ID']) && is_array($actionData['ID']))
				{
					$arIDs = $actionData['ID'];
				}

				foreach($arIDs as $ID)
				{
					if (!CCrmDeal::CheckUpdatePermission($ID, $userPermissions))
					{
						continue;
					}

					$DB->StartTransaction();

					$arUpdateData = array(
						'ASSIGNED_BY_ID' => $actionData['ASSIGNED_BY_ID']
					);

					if($CCrmDeal->Update($ID, $arUpdateData, true, true, array('DISABLE_USER_FIELD_CHECK' => true)))
					{
						$DB->Commit();

						$arErrors = array();
						CCrmBizProcHelper::AutoStartWorkflows(
							CCrmOwnerType::Deal,
							$ID,
							CCrmBizProcEventType::Edit,
							$arErrors
						);
					}
					else
					{
						$DB->Rollback();
					}
				}
			}
		}
		...
	}
}
// <-- POST & GET actions processing


Но есть маленький нюанс, если Вам нужно менять ответственного в связанных сущностях, кастомизация данного кода будет не лучшим решением.
В таком случае у Вас будет задвоение, например ответственного можно поменять через массовую смену ответственного в списке, через редактирование сделки, через блок действия бизнес-процесса и так далее. И все это разные механизмы. Общее у них только одно - они все используют события на изменения/добавление.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы