Задача: загрузка изменений по контактам в bpm и слияние записей со старыми записями. Поиск дублей справляется идеально, но вручную объединять по 40 000 записей слишком долго. Можно ли как-то объединить все дубли сразу, а не нажимать на каждом в отдельности "выбрать все" - "объединить"?

Нравится

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

Есть дополнение Automatic duplicates merge, которое позволяет в том числе и сливать по расписанию.

1) оно платное

2) задачу сливания всех дублей может ведь решаться простым бизнесс-процессом

Можно и так. Если реализуете свой более простой процесс слияния, можете тоже его опубликовать, бесплатно или по меньшей цене.

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

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

 

О компании

Telezon — первый «облачный» центр услуг связи для бизнеса. Компания создает системы связи «под ключ», выполняя полный цикл работ от первой консультации до сдачи готовой системы заказчику, в том числе проектирование, строительство всех необходимых частей связи, поставку и настройку оборудования.

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

Компания Telezon не использовала системы управления внутренними и внешними сервисами до внедрения bpm’online. Поэтому изначально отсутствовали четко прописанные процессы работы сотрудников. Это влекло за собой сложности в проведении контроля и анализа выполненных задач. Не было общей картины работы компании по оказанию услуг постпродажного сопровождения и развития клиентов.

Задача, которая была поставлена перед командой внедрения bpm’online, заключалась в построении качественной работы службы поддержки компании с помощью продукта bpm'online service.

 

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

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

Регистрация обращений происходит по 3 каналам связи: email, портал самообслуживания и с помощью телефонного звонка. В системе был настроен процесс, который объединяет обращения из разных каналов в едином пространстве и предоставляет операторам быстрый доступ к полной истории работы с клиентом. Теперь если клиент обращается в службу поддержки по телефону, менеджер может оперативно предоставить ему консультацию, а также принять решение о создании нового и работы по существующему обращению.

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

С помощью инструмента Case Management реализован алгоритм обработки обращений клиента. Для того чтобы ответственный сотрудник, который взял обращение в работу, оперативно мог получить доступ к нужным статьям в базе знаний, в карточке обращения добавили специальную деталь, в которой отображаются только те статьи, которые соответствуют сервису обращения.

В случае, когда к обработке обращения необходимо подключить специалиста по снабжению, bpmonline автоматически отправляет ему информационное письмо. После чего состояние обращение переключается на «Состояние пауза». Когда специалист по снабжению отправляет ответ на письмо, bpm’online прикрепляет это письмо к обращению и меняет состояние обращения на «Выезд». Это позволяет ответственному за обращение оперативно продолжить работу.

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

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

  • оказанный сервис;
  • предоставленное решение по обращению;
  • клиент и его контактные данные;
  • плановое время реакции и разрешения по сервису;
  • количество затраченных часов сотрудника компании;
  • затраты по обращению.

 

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

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

Результат

Благодаря внедрению bpm’online упрощена работа менеджеров. Заранее прописанный сценарий работы позволяет оптимально использовать время на обработку обращений. Также стало возможным ускорить внутренние процессы благодаря автоматизации уведомлений смежных подразделений по обработке обращений. Все это, вместе с настроенной аналитикой, позволило ускорить обработку обращений и повысить лояльность клиентов к компании.

Нравится

Поделиться

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

Добрый день! 



Подскажите, пожалуйста, как формируется набор прав доступа для входящих писем, пришедших на общий почтовый ящик?



Рассмотрели возможные варианты:

1. Default rights на Activity

2. Allow shared access в настройках почтового ящика

3. Access rights в настройках почтового ящика

Но всё равно в письме появляется не только владелец почтового ящика (что, наверное, логично), но и All employees, от которых надо избавиться





И второй вопрос - почему на исходящие письма с общего почтового ящика не действует такое же распределение прав? Там только автор права получает

Нравится

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

Владимир, нужно искать в скриптах то место, где при синхронизации создаётся запись. Видимо, там выдаются и права. Смотрите в сторону LoadExchangeEmailsProcess, из него ExchangeUtility, ExchangeEmailSyncProvider, ExchangeEmailMessage. Возможно, это тут (в последней):

public Activity GetActivityInstance(SyncContext context, LocalItem localItem, EntitySchema schema,
	Exchange.EmailMessage message, string subject) {
	var instance = (Activity)schema.CreateEntity(context.UserConnection);
	SyncEntity instanceSync = GetActivityInstanceSync(context, message, subject, instance);
	if (instanceSync.Action != SyncAction.Create && !context.UserConnection.GetIsFeatureEnabled("MailboxRightsForEmail")) {
UpdateEmailRelations(context.UserConnection, instance);
	}
	localItem.AddOrReplace(schema.Name, instanceSync);
	return instance;
}

 

Краткое резюме - этих настроек оказалось достаточно. Просто, система не сразу реагировала на их изменение. И получая письма в течение нескольких минут после изменения, всё ещё действовали старые настройки.

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

Добрый день!

появилась ли возможность использования TLS в 7.11?

в 7.12? если да, то где можно ознакомиться с описанием?

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

Вопрос:

Можем ли мы такое реализовать в bpm?

Как это можно реализовать? 

 

Нравится

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

TLS — протокол на смену SSL. В bpm'online должен поддерживаться. Как настроить HTTPS в IIS для сайта — описано тут.

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

Коллеги, добрый день!

Появилась задача, которая потребовала обращения методом из схемы страницы редактирования к кастомной view, созданной в базе. Для начала решение было отработано на демо-стенде по следующему алгоритму:

1. Создается объект UsrVwTest , который наследуется от базового, в нем не добавляется ни одного поля (в view будет 1 колонка с идентификаторами контакта), у него устанавливается признак, что это представление в базе, он сохраняется и публикуется.

2. После этого, через расширение SqlExecutor выполняется что-то в духе

create view UsrVwTest as select top 1 Id as 'Id' from Contact

3. После это прямо из консоли пробую посчитать записи, которые там есть, выполняя следующее:

var esq = this.Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "UsrVwTest" });
esq.addColumn("Id");
esq.getEntityCollection(function (result) {
	if (!result.success) {
		// обработка/логирование ошибки, например
		this.showInformationDialog("Ошибка запроса данных");
		return;
	}
	console.info(result.collection.getCount());
}, this);

Консоль выдает мне 1, то есть проблем с доступом к view нет, там одна строка, как и должно быть.

После этого я повторяю тот же алгоритм на on-site проекте 7.11, в том же порядке. После этого я на аналогичное обращение к view из консоли получаю 500 (InvalidObjectStateException). Запрос в Network падает также с кодом "ErrorCode":"InvalidObjectStateException". Обработка результата падает в ветку с !result.success. Пробовал дополнительно компилировать конфигурацию на разных этапах алгоритма, создавать view различными способами (напрямую в базе, через установку скрипта в конфигурации и т.д.), получаю тот же ответ. Названия view в базе и в конфигурации совпадают, название и количество колонок тоже.  Кроме того, на проекте уже есть view, реализованные ранее, с которыми ведется работа, они реагируют по-разному. Некоторые так же выдают 500, некоторые послушно пишут количество записей внутри себя. 

Резюмируя, мог бы кто-то подсказать, в чем может быть проблема или какой единственно верный алгоритм реализации такой связки? Поиск по статьям привел меня именно к тому алгоритму, который заработал на демо-стенде, но упорно не хочет работать на on-site площадке. 

Нравится

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

Поправка:

По всей видимости, все уже существующие представления ошибок не вызывают. Случаи, когда запрос к ним из консоли выдает 500 - превышение 20 000 записей на выгрузку. 

 

Все получилось. Оказалось, что view нужно создавать именно как dbo.ViewName, а не просто ViewName, иначе InvalidObjectName

 

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

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

Нравится

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

Выдачу прав в зависимости от типа можно сделать при помощи БП, срабатывающего при вставке. А невозможность добавить нужного типа — или кодом дорабатывать, или включить в объекте справочника администрирование по записям и выдать права.

Спасибо, можете, подробнее пояснить как задать права на определенный тип объекта, в Управлении Конфигурацией увидел права ко всему объекту, 

А задать права на конкретные записи можно попробовать через базу.

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

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

Возможно ли в разделе динамически менять entitySchemaName?

Допустим в фильтр добавить кнопку, по нажатию на которую перегружать грид данными другого объекта?

Нравится

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

Скорее всего вы столкнётесь с тем, что колонки будут настроены неправильно. Может лучше 2 грида? 

Варфоломеев Данила,

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

Если данные из разных разделов однотипной структуры, можно сделать в базе view с кучей union из разных таблиц и работать с ней, как с обычной сущностью, при необходимости фильтруя. В Terrasoft 3.Х такой подход использовался в окне уведомлений, где выводилась информация о записях разных разделов, включая самодельные.

Ближайший аналог - это, наверно, журнал изменений.

https://academy.terrasoft.ru/sites/default/files/documents/docs/product…

Там переключение сделано в интерфейсе 5.Х на странице реестра ChangeLogGridPage. Логика загрузки данных при смене схемы реализована в функции InitializeDataSourceCurrentStructure.

Но в 7.Х движок страниц реестра совсем другой.

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

Доброго времени суток!



Существует следующая проблема:



В реестре [Обращения] выделяются сообщения от VIP клиентов, но при выборе этих строк в реестре, они перекрашиваются в дефолтный голубой цвет (цвет выделенной строки). Каким образом можно осуществить замену дефолтного цвета активной строки реестра на тот, что мне нужен, в зависимости от того, является ли клиент VIP или нет. Где определяется стиль выделенной строки реестра?

Нравится

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

Есть бесплатное дополнение «Records color highlighting».

1) Оно абсолютно не решает текущую задачу

2) Оно не работает с логическими полями (только со справочными)

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

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

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

В css выделенная запись задаётся стилем grid-row-selected, там явно прописан этот цвет.

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

Похожая задача и похожая проблема ( https://community.terrasoft.ru/questions/zapros-ne-vozvrasaet-znacenie ). Используя запрос:

var vip = 0;
var recordId = item.get("Id");
var esqCase = Ext.create("Terrasoft.EntitySchemaQuery", {
rootSchemaName: "Case"
});
esqCase.addColumn("UsrVIPobr");
esqCase.getEntity(recordId, function(result) {
if (result.success) {
vip = result.entity.get("UsrVIPobr");
}
}, this);

Получаю корректный Id (по базе находится нужное обращение с нужным id и полем UsrVIPObr). В карточке обращения есть логическое поле UsrVIPobr (1 или 0), но почему-то переменная vip не меняется. Прошу помочь разобраться. Изображение удалено.

Нравится

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

Быстров Сергей,

Добро пожаловать в мир async вычислений, коллбеков и промисов)

Вам надо весь код(который за скриншотом) перенести в коллбек-функцию getEntity. грубо говоря:

var vip=null;
esq.getEntity(id, function(p) {
     //тут vip будет не null
     var vip=...;
 
     if (vip) {....}
}, this);
//тут vip все ещё null, следующие строки кода отработают ДО результата функции getEntity
var a = ...;
....

 

То, что у вас скриншот обрывается на esq.getEntity - уже подозрительно :)

Вы используете переменную vip после выполнения getEntity?

Варфоломеев Данила,

Да, используется для сравнения с константой

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

Быстров Сергей,

Добро пожаловать в мир async вычислений, коллбеков и промисов)

Вам надо весь код(который за скриншотом) перенести в коллбек-функцию getEntity. грубо говоря:

var vip=null;
esq.getEntity(id, function(p) {
     //тут vip будет не null
     var vip=...;
 
     if (vip) {....}
}, this);
//тут vip все ещё null, следующие строки кода отработают ДО результата функции getEntity
var a = ...;
....

 

А есть какие-то безболезненные способы заставить работать код в синхронном режиме?

Быстров Сергей,

нет. только упаковать всё в Terrasoft.chain (те же коллбеки, только в более удобоваримом виде)

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

Есть такой пример в Документации:

Для раздела [Заказы] реализовать выделение тех записей реестра, которые находятся на стадии [Исполнение].

Подскажите: как определять константы для других разделов (интересует выделение Обращений в реестре по их приоритету)?



В этом примере проверятся по стадии [Исполнение] в разделе [Заказы]:

if (running.value === OrderConfigurationConstants.Order.OrderStatus.Running)

 

Нравится

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

Возможно несколько вариантов.

1. По аналогии с сервисом OrderConfigurationConstant, реализовать сервис, в котором будут храниться значения констант приоритетов обращений.

2. Либо сразу же сравнивать с нужным значением Id записи в справочнике приоритетов обращений.

Id нужных значений записей можно получить из базы данных.

Если у Вас приложение on-site, то заходите на сервер баз данных и пишите запрос к таблице CasePriority и получаете нужные значения, если on-demand, то можно обратиться за помощью в службу поддержки.

Также можно себе в конфигурацию установить бесплатное приложение SQL Executor, с помощью которого можно получить значения из нужной таблицы непосредственно из приложения bpm'online.

А вообще, очень похоже, что для Вашей задачи подойдет другое бесплатное приложение Records color highlighting.

Дополнение "Records color highlighting" облегчает навигацию по записям в разделах bpm'online, фокусируя внимание пользователя на элементах, выделенных цветом по предварительно настроенному правилу. Для создания правила выделения можно использовать одно из справочных полей в любом разделе bpm'online и широкую цветовую палитру.

Возможно несколько вариантов.

1. По аналогии с сервисом OrderConfigurationConstant, реализовать сервис, в котором будут храниться значения констант приоритетов обращений.

2. Либо сразу же сравнивать с нужным значением Id записи в справочнике приоритетов обращений.

Id нужных значений записей можно получить из базы данных.

Если у Вас приложение on-site, то заходите на сервер баз данных и пишите запрос к таблице CasePriority и получаете нужные значения, если on-demand, то можно обратиться за помощью в службу поддержки.

Также можно себе в конфигурацию установить бесплатное приложение SQL Executor, с помощью которого можно получить значения из нужной таблицы непосредственно из приложения bpm'online.

А вообще, очень похоже, что для Вашей задачи подойдет другое бесплатное приложение Records color highlighting.

Дополнение "Records color highlighting" облегчает навигацию по записям в разделах bpm'online, фокусируя внимание пользователя на элементах, выделенных цветом по предварительно настроенному правилу. Для создания правила выделения можно использовать одно из справочных полей в любом разделе bpm'online и широкую цветовую палитру.

Остается только один не решенный вопрос - как обратиться к колонке, которой нету в отображении Реестра, но есть в самом обращении. Используемый код:

var vip = item.get("нужная колонка");
if (vip.value === *константа*) {
item.customStyle = {
"color": "black",
"background": "#A52A2A"
};

Корректно работает, если включить нужную колонку в представлении реестра, но как мне ее получать вне зависимости показана она в реестре или нет?

Можно брать Id обращения и получать значение нужной колонки из базы.

Быстров Сергей,

В смысле? Добавляете её, когда формируется запрос на выборку в реестр (см addGridDataColumns из GridUtilities). Далее в updateLoadedGridData точно будет ваша колонка в выборке.

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