Отключение автовыполнения дел при закрытие сделки в CRM Bitrix24

При переводе лидов и сделок в завершающие стадии (успешные и не очень) Bitrix24 автоматически закрывает все дела, которые относятся к обрабатываемому элементу CRM. Но если для лидов существуют специальные настройки, которые позволяют отметить типы дел не требующие автоматического завершения, то со сделками дела обстоят иначе, ядро Bitrix24 строго и бескомпромиссно принимает решение за нас. В какой-то мере данный функционал справедлив и имеет право на существование, но что делать, если нас это не устраивает?

О необходимости реализовать данный функционал я понял прочитав данное предложение на официальном сайте 1c-bitrix «Есть идея!». Пользователи обсуждают возможности управления автоматическим завершением дел начиная с 2018 года, но до сих пор такой возможности нет. На нет и суда нет Сделаем сами!

Шаг 1. План действий

Для начала нужно определить, кто отвечает за автовыполнение дел при завершении сделок, после чего попытаться расширить метод системы дополнительными условиями (не затрагивая ядро системы). Для проверки жизнеспособности нашего способа, ограничимся отключением завершения дел для всех сделок всех направлений.

Шаг 2. Определение места инициализации метода автозавершения

Автоматическое завершение дел вызывается в методе СAllCrmDeal::update (родительский класс CCrmDeal) при условии, что стадия сделки была изменена на отличную от «В процессе» (т.е. на любую финальную).

/**
 * file: bitrix/modules/crm/classes/general/crm_deal.php
 */

public function Update($ID, array &$arFields, $bCompare = true, $bUpdateSearch = true, $options = array())
{
  ...

  //region Complete activities if entity is closed
  if($arRow['STAGE_SEMANTIC_ID'] !== $currentFields['STAGE_SEMANTIC_ID']
     && $currentFields['STAGE_SEMANTIC_ID'] !== Bitrix\Crm\PhaseSemantics::PROCESS)
  {
    CCrmActivity::SetAutoCompletedByOwner(CCrmOwnerType::Deal, $ID);
  }
  //endregion

  ...
}

Метод CCrmActivity::SetAutoCompletedByOwner вызывается при обновлении всех сущностей, которые имеют дела. В качестве обязательных параметров передаются идентификатор CRM сущности и идентификатор элемента. Именно этот метод мы и будем расширять.

Шаг 3. Перегрузка SetAutoCompletedByOwner

Тому как переопределить (перегрузить) метод ядра посвящена целая статья, считая, что повторяться нет необходимости, приведу описание ключевых моментов.

Зададим параметры для переопределения класса CCrmActivity

/**
 * file: local/override.php
 */

$classDirectoryPath = __DIR__ . '/classes';

/**
 * Конфигуратор переопределяемых классов
 */
$config = [
    'CCrmActivity' => [
        'classPath' => __DIR__ . '/../../bitrix/modules/crm/classes/mysql/crm_activity.php',
        'overrideClass' => 'Aclips\Crm\Override\CCrmActivity'
    ],
];

И опишем новый класс

<?php
  
/**
 * file: local/classes/Aclips/Crm/Override/CCrmActivity.php
 */

namespace Aclips\Crm\Override;


IncludeModuleLangFile('/home/bitrix/www/bitrix/modules/crm/classes/mysql/crm_activity.php');


class CCrmActivity extends \CCrmActivity
{

    public static function SetAutoCompletedByOwner($ownerTypeID, $ownerID, array $providerIDs = null, array $options = null)
    {
        // Для сделок отключаем автозавершение
        if ($ownerTypeID == \CCrmOwnerType::Deal) {
            return;
        }

        parent::SetAutoCompletedByOwner($ownerTypeID, $ownerID, $providerIDs, $options);
    }
}

Стоит обратить внимание на подключение языкового файла. Поскольку класс родитель подключает его через магическую константу __FILE__, то пусть (в связи с переопределением) будет не корректен и мы останемся без языка — подключаем напрямую.

Шаг 4. Проверка

Создадим сделку, добавим к ней задачу и завершим её.

Новая сделка с делом «задача»
Завершённая сделка

После завершения сделки задача осталась открытой.

Итог

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

1 комментарий

Добавить комментарий