Доброго времени суток! Есть раздел с раширенными фильтрами и показатель, который ссылается на view. В view есть формула с агрегирующими функциями. Как показатель отфильтровать по отфильтрованному реестру раздела?

Постановка задачи:

Дашборд - Показатель. Если в разделе задан фильтр – обрабатываются только данные фильтра. 

Период - текущий месяц в сравнении с таким же периодом прошлого месяца (с 01.05 по 21.05 сравниваем с 01.04-21.04). 

Алгоритм расчета: ((Количество Лидов за текущий период/Количество Лидов за предыдущий период )-1)*100%



Если не учитывать фильтр, то view формируется на основании этого SQL :

select UsrLeadId, (CAST(T1 AS float) / CAST(T2 AS float)-1)*100 as UsrResult

from

(select Id as UsrLeadId, 

count(CASE

            WHEN CreatedOn >= DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE()), 0)

                And CreatedOn <= GETDATE() THEN 1

            ELSE NULL

          END) OVER () as T1, 

count(CASE

              WHEN CreatedOn > DATEADD(MONTH, DATEDIFF(MONTH, 0, GETDATE())-1, 0)

                And CreatedOn < dateadd(mm,-1,getdate()) THEN 1

            ELSE NULL

          END) OVER () as T2

        from Lead

) l

Нравится

1 комментарий
Лучший ответ

Здравствуйте.

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

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

Здравствуйте.

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

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

Показать все комментарии

Может кто сталкивался с таким поведением в бизнес процессах при их изменении?

Я редактирую какой-либо БП и сохраняю его. Далее запускаю процесс. В журнале отображается, что процесс выполнен полностью. НО! некоторые измененые или новые элементы процесса не меняют данные в записях объектов. Далее, я вставляю в БП автогенерируемую страницу, чтобы убедиться, что данные меняются в процессе, при этом ничего не меняю в других элементах. Поле этого опять запускаю процесс и ВСЕ НАЧИНАЕТ РАБОТАТЬ как надо. Если теперь удалить автостраницу то все продолжает работать. Пробовал делать полную компиляцию и не помогает. Только вставка автостраницы в процесс исправляет ситуацию.

С чем может быть связанно такое поведение системы?

Нравится

3 комментария

Возможно, в первом случае процесс запускали не под Вашим пользователем, а под другим, с ограниченными правами на изменение?

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

Зверев Александр,

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

Посмотреть выполнение процессов и значения параметров их элементов более подробно можно при помощи механизма трассировки.

Показать все комментарии

Здравствуйте!

Создан новый сервер BpmOnline, настроен по инструкции в Академии.

Вход через веб-интерфейс работает без проблем, при попытке входа через мобильный клиент процесс «затыкается» на пункте «Импорт данных (Контрагент)».

Не подскажете, в чем может быть проблема?

В логах IIS строки вида:

 

2019-07-03 06:51:39 192.168.104.132 POST /0/DataService/json/SyncReply/SelectQuery - 80 Egorov_v 192.168.107.173 Mozilla/5.0+(Linux;+Android+8.0.0;+SM-G570F+Build/R16NW;+wv)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Version/4.0+Chrome/75.0.3770.101+Mobile+Safari/537.36 - 200 0 0 103
2019-07-03 06:51:41 192.168.104.132 POST /0/DataService/json/SyncReply/SelectQuery - 80 Egorov_v 192.168.107.173 Mozilla/5.0+(Linux;+Android+8.0.0;+SM-G570F+Build/R16NW;+wv)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Version/4.0+Chrome/75.0.3770.101+Mobile+Safari/537.36 - 200 0 0 100
2019-07-03 06:51:41 192.168.104.132 POST /0/DataService/json/SyncReply/SelectQuery - 80 Egorov_v 192.168.107.173 Mozilla/5.0+(Linux;+Android+8.0.0;+SM-G570F+Build/R16NW;+wv)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Version/4.0+Chrome/75.0.3770.101+Mobile+Safari/537.36 - 200 0 0 39
2019-07-03 06:51:41 192.168.104.132 POST /0/DataService/json/SyncReply/SelectQuery - 80 Egorov_v 192.168.107.173 Mozilla/5.0+(Linux;+Android+8.0.0;+SM-G570F+Build/R16NW;+wv)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Version/4.0+Chrome/75.0.3770.101+Mobile+Safari/537.36 - 200 0 0 167
2019-07-03 06:52:13 192.168.104.132 POST /0/DataService/json/SyncReply/SelectQuery - 80 Egorov_v 192.168.107.173 Mozilla/5.0+(Linux;+Android+8.0.0;+SM-G570F+Build/R16NW;+wv)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Version/4.0+Chrome/75.0.3770.101+Mobile+Safari/537.36 - 200 0 0 83
2019-07-03 06:52:18 192.168.104.132 POST /0/DataService/json/SyncReply/SelectQuery - 80 Egorov_v 192.168.107.173 Mozilla/5.0+(Linux;+Android+8.0.0;+SM-G570F+Build/R16NW;+wv)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Version/4.0+Chrome/75.0.3770.101+Mobile+Safari/537.36 - 200 0 0 2258

Не знаю, куда копать, может подскажете?

Нравится

4 комментария

Выяснилось, что со старым сервером та же проблема, видимо виновато обновление мобильного клиента.

На конференции TechPoint рассказывали о мобильной программе для спортивных ставок, которая плохо работала на демонстрации у заказчика, как оказалось, из-за плохой связи в его офисе. В Вашем случае может тоже быть что угодно. Больше подробностей можно узнать из отчёта по кнопке «Отправить лог». Если подозреваете, что дело в обновлении, попробуйте и на старом, и на новом.

Зверев Александр,

Спасибо, Александр.

Со связью проблем нет - тестировалось на офисном wifi в том числе.

А отправить лог нет возможности - клиент "зависает" на пункте импорта контрагентов, в таком состоянии нельзя ни вернуться на предыдущий шаг на даже закрыть клиент.

Как выяснилось, проблемы возникают не на всех устройствах.

Есть подозрение, что проблема в количестве контрагентов, которое в последние дни подскочило при подключении новых филиалов к системе.

Смотрите логи на стороне мобильного и на стороне сайта (не IIS).

Показать все комментарии

Здравствуйте.

Сталкивался ли кто с необходимостью через бизнес-процесс вытянуть организационную роль контакта?

Получилось вытянуть родительскую роль "Inherited from", для всех контактов читается значение - "All employees". 

Подскажите, реально ли без побочных "костылей" с помощью процесса прочитать орг. роль?

Нравится

5 комментариев
Лучший ответ

Добрый день!

У контакта может быть несколько орг. ролей, так как это деталь.

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





Добрый день!

У контакта может быть несколько орг. ролей, так как это деталь.

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





Добрый день,

Это не очень сложно: но нужно учитывать структуру таблиц где хранятся роли и вхождения в роли. Посмотрите таблицы / объекты "Объект администрирования" и "Вхождение пользователя в роли". В первой хранятся роли и сами пользователи, а во второй хранятся вхождения этих пользователей в соответствующие роли. Так же в таблицах есть тип роли, по которому можно определить организационная это роли или функциональная.

Сидоров Александр В.,

Делала в точности также, только в "Роли пользователя" читала первую запись выборки, а не коллекцию. Спасибо большое, попробую.

Тёскин Дмитрий Валерьевич,

здравствуйте, Дмитрий. 

По таблицам посмотрела. На примере одного контакта: достаточное количество записей орг. ролей вышло. Точно известно, что контакт в настоящее время состоит в одной организационной роли. Эту роль и нужно выцепить.

Вся информация о пользователях и ролях и вхождении первых во вторые хранится в таблицах SysAdminUnit, SysUserInRole и SysAdminUnitInRole. В последнюю переносится после выполнения действия актуализации. Возможно, Вы как раз ещё не актуализировали.

Если есть доступ к базе, сделайте SQL-запросами выборку из этих таблиц: сначала по имени определите Id этого пользователя, а потом посмотрите роли, в которые он входит. Когда структура и условия фильтрации станут ясны, можно будет повторить аналогичные условия выборки средствами движка процессов.

Показать все комментарии
Вопрос

Как использовать BigInt  в ВРМ? 

Не хватает 32 бит, нужно 64, в конфигураторе нет такого выбора!

Нравится

9 комментариев

В дизайнере объектов нельзя добавить поле такого типа. Как обходной вариант, длинное число можно хранить в текстовом поле или в двух и более отдельных числовых, используя вычисление. В коде C#-схем можно создавать переменные типа System.Int64 и работать с ними.

Зверев Александр,

Печалька. Если нельзя в дизайнере, то и в базе будут сложности и в DataService нельзя будет отправить. А в какой-нибудь будущей версии планируется добавить? Всё-таки мы на 64 битных системах уже 10+ лет работаем все

Ещё можно использовать тип «Деньги», то есть Decimal(20,2).

Добрый день, Алексей.

Мы зафиксировали ваше пожелание, на данный момент конкретных планов по этой функциональности нет.

Можете вкратце описать бизнес-кейс, для которого вам потребовалось поле такого типа?

Дмитрий Жаренко,

я думаю таких кейсов полно. У нас - интеграция с внешними ресурсами, там 64-битные ID и их надо сохранять. Конвертить все в деньги туда-сюда - костыль, которого хотелось бы избежать.

Алексей-Карягин,

Спасибо!

Зверев Александр,

Не планируется добавить в систему данный тип?

Так же хотелось бы делать значимые поля(int, dateTime и прочие) nullable, не подсажите это есть в планах? 

Прошло 2 года, сменилось 10+ версий, вменяемого решения так и не появилось? Террасофт?

Добрый день, Алексей!



Получили ответ от Product owner'а ответственной команды разработки. Реализация данной задачи включена в Roadmap команды R&D. Но поскольку есть более приоритетные задачи, в ближайшие пол года работы по решению не планируются.



С уважением, Елена.

Показать все комментарии

Добрый день !

Существует 2 объекта: Проект и Контрагент. Контрагент и Проект содержат в себе справочное поле "Отрасль".  Также в Проекте заполняется поле Контрагент.

Хочу создать Бпроцесс, устанвливающий значение поля Отрасль в Проекте, если заполнить Контрагента, значением поля Отрасль из контрагента. Но зашла в тупик.

При чтении данных разрешено читать данные поля Проект: Отрасль, Контрагент и id. а как считать значение поля Отрасль в контрагенте ? Если добавить новый элемент для чтения данных контрагента, то как указать, что читать следует лишь в том контрагенте, который используется в проекте с данным id (id проекта который был изменен в данный момент) ?

Изображение удалено.

 

Нравится

4 комментария
Лучший ответ

Добрый день!

Ваш процесс должен выглядеть так:







Создала бизнес процесс по примеру из статьи: https://academy.terrasoft.ru/documents/technic-bpms/7-14/kak-chitat-dannye-zapisi-drugogo-obekta   но после запуска процесса ничего не происходит.. ни при создании проекта, ни при изменении. Можно ли где то найти, в чем проблема ?

Здравствуйте. Сначала читаете данные контрагента (либо всех колонок либо необходимых) фильтруя по id из стартового сигнала, берете элемент - http://prntscr.com/o6ffgh

Как то так.

Я бы сделал на событийном слое кодом.

Добрый день!

Ваш процесс должен выглядеть так:







Сидоров Александр В., 

Александр, большая Вам благодарность !  Подправила свой процесс, добавив фильтрацию по id как на Вашем примере ! БПроцесс заработал !

Показать все комментарии

Всем доброго времени суток.

Возможно ли настроить конфигурацию мобильного приложения следующим образом, что бы при срабатывании бизнес правила и обработки модели текущей записи возможно было доставать значения данных из связанных записей? В данном случае меня интересует Контакт - http://prntscr.com/o5yxe7. Без написания запроса. или запрос нужно писать в любом случае? Стоит задача при изменении Контакта необходимо в заказе перезаписывать контактный номер телефона, как лучше реализовать?

Нравится

3 комментария

Стоит задача при изменении Контакта необходимо в заказе перезаписывать контактный номер телефона, как лучше реализовать?

Мне кажется, такое нужно делать не в мобильной версии, а на стороне сервера при синхронизации. Ведь новые данные контакта могут прийти с разных сторон, например, их может исправить пользователь, работающий в веб-версии, интеграция с сайтом, 1С или ещё чем-то. Если менять будут при помощи класса EntitySchemaQuery, можно реализовать логику во встроенном или обычном процессе.

Зверев Александр,

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

В таком случае теряется смысл всего движка бизнес-процессов, который работает на серверной стороне. 

Показать все комментарии

Доброго времени суток! Подскажите, пожалуйста, как добавить CheckBox в средства связи. Для средства связи добавил в объекте логическое значение, например с названием "UsrIsMain".

Нравится

4 комментария
Лучший ответ

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

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

Григорий Чех,

В принципе мне понятно, как конфиг строится. Добавлял TextEdit поле, Lookup поле. А вот CheckBox не получается, выбрасывает ошибку следующую:

 

message: Cannot read property 'changeEvent' of undefined 

 date: Thu Jun 13 2019 11:01:45 GMT+0300 (Москва, стандартное время)

moduleId: CardModuleV2_########GUID###########_ContactPageV2_detail_ContactCommunication

moduleName: DetailModuleV2



Строил сам CheckBox вот так:

{

                        className: "Terrasoft.CheckBoxEdit",

                        id: "CheckBoxEditId",

                        classes: {

                            wrapClass: ["communication-detail-edit-user-class", "communication-additional-edit-label-wrap"]

                        },

                        value: {

                            bindTo: "UsrIsMain"

                        },

                        change: {

                            bindTo: "changeIsMainFlag"

                        }

  };



Сама функция changeIsMainFlag объявлена в ViewConfig'е.

 

Григорий Чех,

Вообще видел уже два поста в коммьюнити, которые тоже не понимали, как CheckBox вставить в Средства связи. Ответа там так и не было.

В детали средств связи контакта в пакете MarketingCampaign есть такое поле «Не актуальный» (NonActual) у каждого средства связи. Посмотреть на реализацию можно в схеме ContactCommunicationDetail.

Показать все комментарии

Имеется иерархическая деталь с редактируемым реестром. В ней возникает проблема при сохранении дробного числа. Появляется ошибка Cannot read property 'getAttribute' of null, которая возникает в результате того, что метод GetDomRow возвращает undefined. После этого я не могу больше сохранять дробные числа в реестре и приходится перезагружать страницу. Первое сохранение проходит удачно, хоть и успевает появиться ошибка. В результате чего возникает такая проблема? ниже представлен код детали

define("IDSBRefrigeratorInTMADetail",
    ["ConfigurationGrid", "ConfigurationGridGenerator", "ConfigurationGridUtilities", "ServiceHelper"],
    function (ConfigurationGrid, ConfigurationGridGenerator, ConfigurationGridUtilities, ServiceHelper) {
        return {
            messages: {
                "ReloadRefrigeratorsInTMAGrid": {
                    "mode": Terrasoft.MessageMode.BROADCAST,
                    "direction": Terrasoft.MessageDirectionType.SUBSCRIBE
                }
            },
            entitySchemaName: "IDSBRefrigeratorInTMA",
            attributes: {
                "IsEditable": {
                    dataValueType: Terrasoft.DataValueType.BOOLEAN,
                    type: Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
                    value: true
                }
            },
            mixins: {
                ConfigurationGridUtilities: "Terrasoft.ConfigurationGridUtilities"
            },
            details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
            diff: /**SCHEMA_DIFF*/[
                {
                    "operation": "merge",
                    "name": "DataGrid",
                    "values": {
                        "hierarchical": true,
                        "hierarchicalColumnName": "IDSBParent",
                        "className": "Terrasoft.ConfigurationGrid",
                        "generator": "ConfigurationGridGenerator.generatePartial",
                        "generateControlsConfig": { "bindTo": "generateActiveRowControlsConfig" },
                        "changeRow": { "bindTo": "changeRow" },
                        "unSelectRow": { "bindTo": "unSelectRow" },
                        "onGridClick": { "bindTo": "onGridClick" },
                        "activeRowAction": { "bindTo": "onActiveRowAction" },
                        "initActiveRowKeyMap": { "bindTo": "initActiveRowKeyMap" },
                        "multiSelect": false
                    }
                },
                {
                    "operation": "remove",
                    "name": "AddRecordButton"
                }]/**SCHEMA_DIFF*/,
            methods: {
                generateActiveRowControlsConfig: function (id, columnsConfig, rowConfig) {
                    this.columnsConfig = columnsConfig;
                    var gridData = this.getGridData();
                    var activeRow = gridData.get(id);
                    var isEditableColumn;
                    if (activeRow.values.IDSBParent === "") {
                        isEditableColumn = this.ParentColumnIsEditable;
                    }
                    else {
                        isEditableColumn = this.ColumnIsEditable;
                    }
                    var gridLayoutItems = [];
                    var currentColumnIndex = 0;
                    Terrasoft.each(columnsConfig, function (columnConfig) {
                        var cellConfig = this.getActiveRowCellConfig(columnConfig, currentColumnIndex);
                        cellConfig.enabled = isEditableColumn(cellConfig.name);
                        if (!cellConfig.hasOwnProperty("isNotFound")) {
                            gridLayoutItems.push(cellConfig);
                        }
                        currentColumnIndex += cellConfig.layout.colSpan;
                    }, this);
                    this.applyBusinessRulesForActiveRow(id, gridLayoutItems);
                    var viewGenerator = Ext.create(this.getRowViewGeneratorClassName());
                    viewGenerator.viewModelClass = this;
                    var gridLayoutConfig = viewGenerator.generateGridLayout({
                        name: this.name,
                        items: gridLayoutItems
                    });
                    rowConfig.push(gridLayoutConfig);
                },
                ParentColumnIsEditable: function (columnName) {
                    return (columnName === "IDSBPlacementPrice" || columnName === "IDSBNumberOfDoors" || columnName === "IDSBProlongation");
                },
                ColumnIsEditable: function (columnName) {
                    return (columnName === "IDSBRBBottlePlan" || columnName === "IDSBRBBottleCurrent"
                        || columnName === "IDSBBRBottlePlan" || columnName === "IDSBBRBottleCurrent");
                },
                init: function () {
                    this.callParent(arguments);
                    this.set("IsPageable", false);
                    this.set("RowCount", 28000);
                    this.sandbox.subscribe("ReloadRefrigeratorsInTMAGrid", this.onReloadRefrigeratorsInTMAGrid, this);
                },
                onReloadRefrigeratorsInTMAGrid: function (args) {
                    var id = this.get("MasterRecordId");
                    debugger;
                    if (id === args) {
                        this.reloadGridData();
                    }
                },
                addGridDataColumns: function (esq) {
                    this.callParent(arguments);
                    if (!esq.columns.contains("IDSBParent")) {
                        esq.addColumn("IDSBParent");
                    }
                },
                getGridDataColumns: function () {
                    var gridDataColumns = this.callParent(arguments);
                    if (!gridDataColumns.IDSBParent) {
                        gridDataColumns.IDSBParent = {
                            path: "IDSBParent"
                        };
                    }
                    return gridDataColumns;
                },
                addToolsButtonMenuItems: function (toolsButtonMenu) {
                    this.addGridOperationsMenuItems(toolsButtonMenu);
                    if (this.useDetailWizard) {
                        this.addDetailWizardMenuItems(toolsButtonMenu);
                    }
                },
                prepareResponseCollection: function (collection) {
                    collection.each(function (item) {
                        var parent = item.get("IDSBParent");
                        var parentId = parent && parent.value;
                        if (parentId) {
                            item.set("IDSBParentId", parentId);
                        }
                        Terrasoft.each(item.columns, function (column) {
                            this.addColumnLink(item, column);
                            this.applyColumnDefaults(column);
                        }, this);
                    }, this);
                }
            }
        };
    });

Изображение удалено.

Нравится

2 комментария

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

В любом случае вам может помочь только отладка кода!

решил задачу тупо влоб, переопределив метод сохранения. Написал своё сохранение, вызывая сервис из сервера. немного медленно, но работает

saveRowChanges: function (row, callback, scope) {
                    scope = scope || this;
                    callback = callback || Terrasoft.emptyFn;
                    if (row &amp;&amp; this.getIsRowChanged(row)) {
                        if (row.values.IDSBParent !== "") {
                            this.saveChildRow(row, callback, scope);
                        }
                        else {
                            this.saveParentRow(rowm, callback, scope);
                        }
                    } else {
                        callback.call(scope);
                    }
                },
saveChildRow: function (row, callback, scope) {
                    var changed = row.changedValues;
                    debugger;
                    if (!changed.hasOwnProperty("IDSBBRBottleCurrent")) {
                        changed.IDSBBRBottleCurrent = row.values.IDSBBRBottleCurrent;
                    }
                    if (!changed.hasOwnProperty("IDSBBRBottlePlan")) {
                        changed.IDSBBRBottlePlan = row.values.IDSBBRBottlePlan;
                    }
                    if (!changed.hasOwnProperty("IDSBRBBottlePlan")) {
                        changed.IDSBRBBottlePlan = row.values.IDSBRBBottlePlan;
                    }
                    if (!changed.hasOwnProperty("IDSBRBBottleCurrent")) {
                        changed.IDSBRBBottleCurrent = row.values.IDSBRBBottleCurrent;
                    }
                    callback = this.reloadGridData;
                    var serviceSaveData = {
                        RowId: row.values.Id,
                        bottles: changed
                    }
                    ServiceHelper.callService("IDSBPlacingREService", "SaveChildRow",
                        callback, serviceSaveData, scope);
                }

 

Показать все комментарии

 Изображение удалено.

О компании

BOX Catering — компания, которая занимается доставкой готовой еды в коробках. Это кейтеринг, который Вы можете заказывать себе действительно каждый день в офис или домой.

 

Предпосылки внедрения bpmonline

Работа с клиентами в компании проводилась в индивидуальных табличных формах «Excel», что было в свою очередь разрозненно, и не способствовало консолидации информации в единой системе. Также отсутствовала возможность качественно анализировать деятельность отдела продаж и планировать развитие бизнеса. Для агрегации информации, построения процесса продаж была выбрана bpm'online sales enterprise.

 

Задачей внедрения bpm'online было создать и автоматизировать рабочий процесс отдела продаж, который бы позволил эффективно работать с клиентами в направлении B2B и B2C сегментов.

Выполненные настройки

В рамках процесса внедрения была доработана карточка «Лида», были добавлены такие поля как:

- информационный повод мероприятия;

- количество гостей;

- место проведения мероприятия;

- тип заказа;

- дата мероприятия.

Фиксация данной информации позволит внести максимально полные данные по предстоящему мероприятию.

 Изображение удалено.

 

Процесс работы с клиентом начинается с референтной стадии лида «Квалификация», на которой добавлены задачи по выяснению и внесению дополнительных контактных лиц, с целью определения ЛПР. Далее процесс переходит на стадию «Перевод в продажу», в случае горящей потребности у клиента создается «Продажа», если же нет, то процесс возвращается на этап «Взращивания» в рамках которого основная цель назначить встречу с клиентом, и по результатам встречи перевести Лид в Продажу.

В карточку продажи были также добавлены поля, такие как:

- количество гостей

- итоговая сумма по мероприятию

- итоговая сумма на одного гостя.

 

 Изображение удалено.

 

 

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

 

Изображение удалено. 

         

Процесс продажи также был изменен. На первой стадии «Квалификация» добавлены задачи по подготовке и проведению встречи по снятию запроса от клиента о планируемом мероприятии. Далее «Коммерческое предложение», на которой менеджер формирует и направляет  клиенту коммерческое предложение. После отправки предложения процесс переходит на стадию «Презентация». В рамках данной стадии проводится встреча по презентации КП и обсуждение дальнейшей работы, следующим шагом происходит переход на стадию «Утверждение» в рамках которой добавлены задачи по контролю оплаты от клиента. После прохождения оплаты запускается подготовка мероприятия сотрудниками компании BoxCatering.

 

Результат

Внедрение bpm’online позволило автоматизировать работу менеджеров отдела продаж. Качественная работа менеджеров с клиентами, фиксация всех договоренностей, автоматический просчет данных необходимых для формирования документов, сделали работу менеджеров эффективнее. Освободившееся время менеджеры планируют использовать, для увеличения клиентского портфеля.

Нравится

Поделиться

0 комментариев
Показать все комментарии