Creatio development guide
PDF
Документация по разработке
Разработка в bpm'online на примерах
Это документация Creatio версии 7.12.0. Мы рекомендуем использовать новую версию документации.

Как изменить расчеты в воронке продаж

Glossary Item Box

Существует возможность изменять расчеты в воронке, которая подключена к объекту раздела [Продажи], для отображения по нему аналитики. Для этого нужно создать новый модуль для расчетов и заменить клиентскую схему отображения воронки.

Последовательность действий для изменения расчетов в воронке:

  1. Создать новый класс, который наследуется от FunnelBaseDataProvider и задать логику расчетов.
  2. Создать замещающую клиентскую схему FunnelChartSchema и использовать в ней новый класс расчетов.

Пример изменения отображения расчетов в воронке продаж в срезе “по количеству”

Описание кейса

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

Алгоритм реализации кейса

1. В пользовательском пакете создать новый модуль

В пользовательском пакете необходимо создать новый клиентский модуль провайдера расчетов. Провайдер расчетов — это класс, который отвечает за выборку, фильтрацию и обработку данных для графика воронки.

В качестве имени и заголовка для создаваемого модуля необходимо указать, например, UsrFunnelByProductCountDataProvider (рис. 1).

Рис. 1. — Свойства модуля провайдера расчетов

2. Добавить локализируемые строки

В коллекцию локализируемых строк созданного клиентского модуля необходимо добавить строку со значением Количество продуктов. Для этого, щелкнув правой клавишей мыши по узлу структуры [LocalizableStrings], нужно из всплывающего меню выбрать команду [Добавить]. Для созданной строки нужно установить свойства так, как показано на рисунке 2.

Рис. 2. — Свойства локализируемой строки

Также аналогичным образом необходимо добавить локализируемую строку CntOpportunity со значением Количество продаж.

3. Добавить реализацию в модуль провайдера

Для изменения расчетов воронки нужно переопределить:

  • метод формирования колонок addQueryColumns для выборки данных;
  • методы обработки данных выборки.

Для обработки одной записи выборки нужно определить метод getSeriesDataConfigByItem. Для обработки всей коллекции нужно определить метод prepareFunnelResponseCollection. Для желаемой фильтрации записей нужно переопределить метод applyFunnelPeriodFilters.

Ниже приведен исходный код нового модуля провайдера расчетов воронки продаж.

define("UsrFunnelByProductCountDataProvider", ["ext-base", "terrasoft", "UsrFunnelByProductCountDataProviderResources",
        "FunnelBaseDataProvider"],
    function(Ext, Terrasoft, resources) {
        // Определение нового провайдера расчетов.
        Ext.define("Terrasoft.configuration.UsrFunnelByProductCountDataProvider", {
            // Наследование от базового провайдера.
            extend: "Terrasoft.FunnelBaseDataProvider",
            // Сокращенное имя нового провайдера
            alternateClassName: "Terrasoft.UsrFunnelByProductCountDataProvider",
            // Метод для обработки всей коллекции.
            prepareFunnelResponseCollection: function(collection) {
                this.callParent(arguments);
            },
            // Расширение метода базового модуля FunnelBaseDataProvider. 
            // Устанавливает колонку количества продуктов для выборки данных.
            addQueryColumns: function(entitySchemaQuery) {
                // Вызов родительского метода.
                this.callParent(arguments);
                // Добавляет в выборку колонку количества продуктов
                entitySchemaQuery.addAggregationSchemaColumn("[OpportunityProductInterest:Opportunity].Quantity",
                        Terrasoft.AggregationType.SUM, "ProductsAmount");
            },
            // Расширение метода базового класса FunnelBaseDataProvider.
            // Устанавливает фильтрацию для выборки
            applyFunnelPeriodFilters: function(filterGroup) {
                // Вызов родительского метода.
                this.callParent(arguments);
                // Создает группу фильтров.
                var endStageFilterGroup = Terrasoft.createFilterGroup();
                // Устанавливает тип оператора для группы.
                endStageFilterGroup.logicalOperation = Terrasoft.LogicalOperatorType.OR;
                // Добавляет фильтр, который указывает, что стадия на продаже еще не окончена.
                endStageFilterGroup.addItem(
                    Terrasoft.createColumnIsNullFilter(this.getDetailColumnPath("DueDate")));
                // Добавляет фильтр, который указывает, что стадия на продаже является завершающей.
                endStageFilterGroup.addItem(
                    Terrasoft.createColumnFilterWithParameter(Terrasoft.ComparisonType.EQUAL,
                        this.getDetailColumnPath("Stage.End"), true, Terrasoft.DataValueType.BOOLEAN));
                filterGroup.addItem(endStageFilterGroup);
            },
            // Расширение метода базового модуля FunnelBaseDataProvider. 
            // Обрабатывает данные для стадий в воронке.
            getSeriesDataConfigByItem: function(responseItem) {
                // Объект, хранящий локализируемые строки.
                var lcz = resources.localizableStrings;
                // Получает объект данных стадии из родительского метода.
                var config = this.callParent(arguments);
                // Получает данные о количестве продуктов в продаже из результата выборки.
                var products = responseItem.get("ProductsAmount");
                products = Ext.isNumber(products) ? products : 0;
                // Форматирует строки.
                var name = Ext.String.format("{0}<br/>{1}: {2}<br/>{3}: {4}",
                    config.menuHeaderValue, lcz.CntOpportunity, config.y, lcz.FunnelProductsCaption, products);
                var displayValue = Ext.String.format("<br/>{0}: {1}", lcz.FunnelProductsCaption, products);
                // Устанавливает новые данные в объект данных и возвращает его.
                return Ext.apply(config, {
                    name: name,
                    displayValue: displayValue
                });
            }
        });
    });

4. Создать замещающую схему для графика воронки

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

Для этого необходимо создать замещающий клиентский модуль и указать ему схему FunnelChartSchema в качестве родительского объекта (рис. 3).

Рис. 3. — Свойства замещающего модуля

Также необходимо добавить в зависимости новый модуль для расчетов (секция Dependencies), указав его имя в поля [Зависимость] и [Название] значения UsrFunnelByProductCountDataProvider (рис. 4).

Рис. 4. — Свойства зависимости схемы воронки

5. Указать новый провайдер расчетов в замещенной схеме воронки

Для этого в замещенной схеме необходимо переопределить метод getProvidersCollectionConfig, возвращающий конфигурационный объект с коллекцией провайдеров.

define("FunnelChartSchema", ["UsrFunnelByProductCountDataProvider"],
    function() {
        return {
            entitySchemaName: "Opportunity",
            methods: {
                getProvidersCollectionConfig: function() {
                    // Вызывает родительский метод.
                    // Возвращает массив провайдеров.
                    var config = this.callParent();
                    // Ищет провайдер данных в срезе по количеству продаж.
                    var byCount = Terrasoft.findItem(config, {tag: "byNumberConversion"});
                    // Заменяет на новый класс.
                    byCount.item.className = "Terrasoft.UsrFunnelByProductCountDataProvider";
                    return config;
                }
            }
        };
    });

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

Рис. 5. — Воронка продаж с отображением количества продуктов, добавленных в продажи

© Terrasoft 2002-2019.

Был ли данный материал полезен?

Как можно улучшить эту статью?