← Назад к справке

CRM

Стадии и воронки

Рабочая справка по стадиям и воронкам CRM в коробочном Bitrix24: CATEGORY_ID, STAGE_ID, DealCategory, StatusTable и смена стадии через фабрики.

В сделках воронка хранится в CATEGORY_ID, а стадия — в STAGE_ID. Один и тот же текст стадии в разных воронках может иметь разные ID.

Общее понимание

Перед переносом карточек важно понять, из какой воронки взята стадия.

CATEGORY_ID и STAGE_ID

Поле Что означает
CATEGORY_ID Воронка или направление.
STAGE_ID Стадия внутри воронки.
STAGE_SEMANTIC_ID Смысловая группа стадии: в работе, успешная, провальная.

Для общей воронки сделок справочник стадий обычно DEAL_STAGE. Для воронки с ID 10DEAL_STAGE_10.

Стадии сделок

Сделки могут иметь несколько воронок. У каждой воронки свой набор стадий.

/**
 * Получает код справочника стадий сделки.
 */
function buildDealStageEntityId(int $category_id): string
{
    if ($category_id <= 0) {
        return 'DEAL_STAGE';
    }

    return 'DEAL_STAGE_' . $category_id;
}

$stage_entity_id = buildDealStageEntityId($category_id);

Стадии смарт-процессов

Для смарт-процессов удобнее получать стадии через фабрику. Так не нужно вручную собирать код справочника стадий.

Получение

Базовые способы получить воронки и стадии через PHP.

Получить воронки сделок

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Category\DealCategory;

Loader::includeModule('crm');

/**
 * Получает список воронок сделок.
 */
function fetchDealCategories(): array
{
    $categories = [];

    $category_result = DealCategory::getList([
        'select' => [
            'ID',
            'NAME',
            'SORT',
            'IS_LOCKED',
        ],
        'order' => [
            'SORT' => 'ASC',
            'ID' => 'ASC',
        ],
    ]);

    while ($category = $category_result->fetch()) {
        $categories[] = $category;
    }

    return $categories;
}

$categories = fetchDealCategories();

print_r($categories);

Нулевая воронка — основная. В некоторых старых методах она может обрабатываться отдельно, поэтому её лучше учитывать явно.

Получить стадии воронки сделки

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Category\DealCategory;

Loader::includeModule('crm');

/**
 * Получает стадии воронки сделки.
 */
function fetchDealCategoryStages(int $category_id): array
{
    return DealCategory::getStageList($category_id);
}

$stages = fetchDealCategoryStages($category_id);

print_r($stages);

Получить стадии через StatusTable

Стадии CRM также можно читать из справочника статусов.

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\StatusTable;

Loader::includeModule('crm');

/**
 * Получает элементы справочника стадий.
 */
function fetchStageStatuses(string $entity_id): array
{
    $statuses = [];

    $status_result = StatusTable::getList([
        'select' => [
            'ID',
            'ENTITY_ID',
            'STATUS_ID',
            'NAME',
            'SORT',
            'SEMANTICS',
        ],
        'filter' => [
            '=ENTITY_ID' => $entity_id,
        ],
        'order' => [
            'SORT' => 'ASC',
        ],
    ]);

    while ($status = $status_result->fetch()) {
        $statuses[] = $status;
    }

    return $statuses;
}

$statuses = fetchStageStatuses('DEAL_STAGE');

print_r($statuses);

Изменение стадии

Стадию лучше менять через операцию фабрики, чтобы сработала CRM-логика.

Перевести сделку на стадию

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Service;

const CRM_DEAL_TYPE_ID = \CCrmOwnerType::Deal;

Loader::includeModule('crm');

/**
 * Переводит сделку в другую воронку и стадию.
 */
function moveDealToCategoryStage(int $deal_id, int $category_id, string $stage_id): array
{
    $factory = Service\Container::getInstance()->getFactory(CRM_DEAL_TYPE_ID);

    if ($factory === null) {
        return [
            'is_success' => false,
            'error_messages' => ['Фабрика сделок не найдена'],
        ];
    }

    $deal_item = $factory->getItem($deal_id);

    if ($deal_item === null) {
        return [
            'is_success' => false,
            'error_messages' => ['Сделка не найдена'],
        ];
    }

    $deal_item->set('CATEGORY_ID', $category_id);
    $deal_item->setStageId($stage_id);

    $operation = $factory->getUpdateOperation($deal_item);
    $operation_result = $operation->launch();

    return [
        'is_success' => $operation_result->isSuccess(),
        'error_messages' => $operation_result->getErrorMessages(),
    ];
}

$result = moveDealToCategoryStage($deal_id, $category_id, $stage_id);

print_r($result);

Перевести элемент смарт-процесса

<?php

use Bitrix\Main\Loader;
use Bitrix\Crm\Service;

const SMART_PROCESS_ENTITY_TYPE_ID = 1044;

Loader::includeModule('crm');

/**
 * Переводит элемент смарт-процесса на стадию.
 */
function moveSmartProcessItemToStage(int $entity_type_id, int $item_id, string $stage_id): array
{
    $factory = Service\Container::getInstance()->getFactory($entity_type_id);

    if ($factory === null) {
        return [
            'is_success' => false,
            'error_messages' => ['Фабрика смарт-процесса не найдена'],
        ];
    }

    $item = $factory->getItem($item_id);

    if ($item === null) {
        return [
            'is_success' => false,
            'error_messages' => ['Элемент не найден'],
        ];
    }

    $item->setStageId($stage_id);

    $operation = $factory->getUpdateOperation($item);
    $operation_result = $operation->launch();

    return [
        'is_success' => $operation_result->isSuccess(),
        'error_messages' => $operation_result->getErrorMessages(),
    ];
}

$result = moveSmartProcessItemToStage(
    SMART_PROCESS_ENTITY_TYPE_ID,
    $item_id,
    $stage_id
);

print_r($result);

Источники