Добавление кнопки звонка к полю, как в средствах связи, что бы можно было при звонке привязать в "Связи" запись раздела из которого был произведен звонок

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

Нравится

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

Добрый день! что касается добавления кнопки к полю, то подобное описано в данной статье. Что касается осуществление звонка, то Вам нужно подключить миксин CommunicationOptionsMixin в своем модуле откуда будете осуществлять звонок и привязать на кнопку метод обработчик, в результате выполнения которого будет вызываться один из методов миксина: callContact(number, contactId) или же callAccount: function(number, accountId)

Нигрескул Алексей,

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

Александр, эта функция в CommunicationOptionsMixin в конечном счёте посылает сообщение через «песочницу»:

this.sandbox.publish("CallCustomer", {
	number: number,
	customerId: customerId,
	entitySchemaName: entitySchemaName,
	callRelationFields: relationFields
});

А обработчик — в CtiPanelModelUtilities:

/**
 * Handler of call to the subscriber event.
 * @param {Object} numberInfo Call parameters information.
 * @param {String} numberInfo.number Subscribers phone number.
 */
onCallCustomer: function(numberInfo) {
	if (!this.get("IsConnected")) {
		this.sandbox.publish("SelectCommunicationPanelItem", {selectedItem: "CtiPanel"});
		this.logInfo(this.getResourceString("NotConnectedMessage"));
		return;
	}
	var phoneNumber = numberInfo.number;
	if (numberInfo.customerId) {
		this.set("AdvisedIdentifiedSubscriberInfo", numberInfo);
	}
	this.callByNumber(phoneNumber);
},

То есть параметр «customerId» не является обязательным и можно попробовать вызвать с одним лишь номером. А о добавлении связей, нужно смотреть, в каком формате при нормальном звонке передаётся callRelationFields и заполнить аналогичным.

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

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

Если штатными API звонков не получится, можно вычислить Id нового звонка и создать записи или заполнить поля связей как обычные данные, заполнив поля по аналогии. Более подробно увидеть, что создаётся, можно, отловив уходящие к серверам HTTP или SQL-запросы.

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

Добрый день.

С помощью БП я создаю лид при поступлении звонка, и мне необходимо добавить запись звонка к этому лиду.

Пытаюсь добавить к записи звонка мой созданный лид (настройки элемента ниже),Изображение удалено. 

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

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

Нравится

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

Добрый день.

В теории так, как Вы реализовали, должно работать.

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

Также, если у Вас on-site, то с помощью SQL Server Profiler можно посмотреть, какой запрос идет базу, когда выполняется этот элемент.

Алла Савельева,

Судя по данным трассировки БП то лид добавляется, но по факту оказывается что нет:

Семенов Михаил пишет:

Судя по данным трассировки БП то лид добавляется

А разве проблема была в том, что лид не добавлялся - Вы же писали, что в звонке не заполняется поле 'Лид'?

Всё-таки просмотрите профайлером, какой запрос идет в базу.

Алла Савельева,

да, я это и имел ввиду - не добавляется лид к звонку) Я просто различаю термины "добавить" и "создать"))

 

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

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

Добрый день!

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

хотя при записи результата текст разбивался на абзацы.

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

Нравится

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

Посмотрел в базе, сообщения ленты хранятся в таблице SocialMessage в поле Message в таком формате:

<p>строка 1</p> <div>строка 2</div> <div>строка 3</div>

Видимо, при добавлении программно нужно имитировать этот формат.

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

Показать все комментарии
Идея
Обсуждение

При звонке (входящем или исходящем) давать возможность пользователю оперативно ввести содержание звонка в той же CTI панели.

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

Здравствуйте, Владимир!

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

Интересует, когда планируется реализация данной функциональности?

Сейчас, например, при входящем звонке отображается только имя контакта, а все остальные связанные записи, в том числе и контрагент контакта - нет(

Все связи звонка можно открыть так:

В свёрнутом виде их наличие обозначено иконкой, в развёрнутом — видно контакт, контрагент и прочие связанные сущности.

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

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

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

Можно нажать на имя контакта и откроется его карточка, где посмотреть контрагента и остальную информацию.

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

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

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

Алла, узнать о планах на будущие версии можно на соответствующей странице. Пока там вижу улучшение при входящем звонке только для iOS:

АВТООПРЕДЕЛЕНИЕ НОМЕРА КОНТАКТА

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

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

Версия
7.9.1.3284
Нужно добавить в БП звонок-элемент чтобы его привязать к активностям и другим объектам.

Нравится

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

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

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

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

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

Вы можете настроить процесс:
1. Стартовый сигнал по изменению записи в звонке, где Активность заполнена.
2. Читать данные в активности, где Id = Пункт 1. Активность.
3. Раздать права доступа на активность, где Id = Пункт 2. Id
4. Открыть страницу редактирования активности, где Id = Пункт 2. Id

Хорошо, это сделаю, но как настроить видимость кнопок звонка и эмейла в миникарточке активности, они создаются динамически. (две кнопки ля контакта и две для контрагента)

Добрый день!

Не могли бы Вы прикрепить скриншот Вашей миникарточки и код создания данных кнопок?


Вот карточка, кнопки базовые(есть еще емейл но в контакте его нет и тут его не видно)

Здравствуйте, Виталий!

Логика данной миникарточки находится в UIv2.ActivityMiniPage. Кнопки добавляются при ее создании(методы init и onEntityInitialized). Логика отображения кнопок находится в UIv2.MiniPageEntityConnectionsUtils и NUI.EmailExtendedMenu и работает именно так как Вы описали - при создании миникарточки формируется EntitySchemaQuery запрос в базу данных, и если у данного контака(контрагента) заполнена колонка телефон(e-mail) кнопка будет добавлена. Если таких данных нет - не будет и кнопки.

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

В старых вебинарах я рассказывал о реализации функции “звонк на ответственного” через разработку дополнительного web-сервиса без авторизации в bpm’online. Данный сервис позволяет определить контакта по номеру телефона, найти внутренний номер сотрудника, закрепленного за этим контактом и направить звонок непосредственно на него. Только если он не ответил на протяжение n-секунд, отправить по общему правилу.

В представленной мною реализации было несколько проблем:

  1. Сервис без авторизации, а значит, к нему легко получить доступ. Ничего, кроме внутреннего номера ответственного по заданному номеру клиента не увидят. Но, это все же не безопасный метод.
  2. Есть основание полагать, что после очередного обновления bpm’online, этот сервис перестанет работать и нужна будет повторная его установка.

В документации по разработке bpm’online 7.8 появилось описание интеграции с помощью веб-службы DataService. Как уверяют меня коллеги, этот функционал был давно, но, описание появилось только начиная с 7.8 :wink: Вот на него и будем переводить нашу функцию “Звонок на ответственного”.

Для реализации поставленной задачи, нужна сборка ACR от 27.06.2016 или старше (начиная с релиза webitel v3.3.0), где была добавлена функция реверса строки и работы с Cookie. Так же, нам понадобиться логин и пароль пользователя bpm’online, у которого есть доступ на чтение в разделе Контакты.

В public маршруте проходим авторизацию с помощью httpRequest и получаем cookies в переменную:

{
    "httpRequest": {
        "exportCookie": "my_cookie",
        "url": "https://my.bpmonline.com/ServiceModel/AuthService.svc/Login",
        "method": "POST",
        "headers": {
            "Content-Type": "application/json"
        },
        "data": {
            "UserName": "Supervisor",
            "UserPassword": "Supervisor"
        }
    }
}

Дальше, имея cookie, мы можем получить доступ к DataService. Номера телефонов контактов хранятся в bpm’online в колонке Number таблицы ContactCommunication. И мы бы могли написать запрос, если бы не одно НО – как быть с символами, пробелами и другими знаками, что вносит пользователь в поле номера телефона? Для этого в bpm’online имеется скрытая колонка SearchNumber, где хранятся только цифры в обратном порядке (для более быстрого поиска). Этим мы и воспользуемся. Но, для начала обернем наш номер с помощью строковой функции reverse:

{
    "string": {
        "fn": "reverse",
        "data": "${caller_id_number}",
        "setVar": "reverted_caller_id_number"
    }
}

В переменной reverted_caller_id_number у нас будет обернутое значение номера телефона. Отправляем запрос на получение имени контакта по номеру и его ответственного:

{
    "httpRequest": {
        "url": "https://my.bpmonline.com/0/dataservice/json/reply/SelectQuery",
        "method": "POST",
        "headers": {
            "Cookie": "${my_cookie}",
            "Accept": "application/json;odata=verbose"
        },
        "exportVariables": {
            "effective_caller_id_name": "rows.0.Name",
            "owner_caller_id_number": "rows.0.OwnerLogin"
        },
        "data": {
            "QueryType": 0,
            "Columns": {
                "Items": {
                    "Name": {
                        "OrderDirection": 0,
                        "OrderPosition": 0,
                        "Caption": null,
                        "Expression": {
                            "ExpressionType": 0,
                            "ColumnPath": "Name"
                        }
                    },
                    "OwnerLogin": {
                        "OrderDirection": 0,
                        "OrderPosition": 0,
                        "Caption": null,
                        "Expression": {
                            "ExpressionType": 0,
                            "ColumnPath": "[WSysAccount:Contact:Owner].Login"
                        }
                    }
                }
            },
            "AllColumns": false,
            "IsDistinct": false,
            "RowCount": 1,
            "Filters": {
                "FilterType": 6,
                "ComparisonType": 0,
                "LogicalOperation": 0,
                "IsNull": true,
                "IsEnabled": true,
                "IsNot": false,
                "Items": {
                    "FilterByPhone": {
                        "FilterType": 1,
                        "ComparisonType": 9,
                        "LogicalOperation": 0,
                        "IsNull": true,
                        "IsEnabled": true,
                        "IsNot": false,
                        "LeftExpression": {
                            "ExpressionType": 0,
                            "ColumnPath": "[ContactCommunication:Contact].SearchNumber"
                        },
                        "RightExpression": {
                            "ExpressionType": 2,
                            "ColumnPath": null,
                            "Parameter": {
                                "DataValueType": 1,
                                "Value": "${reverted_caller_id_number}"
                            }
                        }
                    }
                }
            },
            "RootSchemaName": "Contact",
            "OperationType": 0
        }
    }
}

Результат мы сохраняем в 2-х переменных:

effective_caller_id_name – webitel подставит значение из этой переменной в SIP From.
owner_caller_id_number – а здесь у нас храниться внутренний номер ответственного по контакту. Теперь достаточно выполнить звонок на этот номер.
Ответственный получает входящий звонок с именем контакта:

Звонок на ответственного

Полный пример маршрута Вы найдете на страницах базы знаний webitel.

Нравится

Поделиться

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

Коллеги, приветствую.

В дизайнере бизнес- процессов есть действие "Звонок". Как запланировать его на определенную дату?
Посмотрел в настройках, ничего похожего не нашел:

Был бы весьма признателен за информацию.

Спасибо.

--
С уважением, Алексей Быков.

Нравится

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

Добрый день,

Можно с помощью планировщика запланировать время выполнения самого процесса.
http://www.community.terrasoft.ru/forum/topic/12917
Можно запланировать время выполнения элемента с помощью Таймера.
Нужно понимать, что в этих случаях необходимо отталкиваться от какого-то времени или события.

Можно добавить активность с типом звонок с помощью элемента Добавление данных – указать дату начала активности.

Здравствуйте, Олег! Отлично, спасибо большое, буду пробовать.

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

Добрый день!
ITIL Transitions
Насколько мне известно, в карточке звонка у оператора должны быть кнопки дальнейшего действия
"создать новое обращение"
"создать консультацию по существующему обращению"

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

Нравится

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

Добрый день, Дарья!

В продукте ITIL transitions преднастроенных процессов по обработке обращений и CTI панели и возможности их настраивать нет. Данные процессы Вы можете найти в продукте Customer Engagement Center.

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

Добрый день, Елена!
Мне как-то с трудом верится, что даже нет возможности настраивать. Вы уверены в ответе?
Вот звонит пользователь, оператор принимает звонок, и ему нужно создать обращение на основании звонка - это же самая стандартная задача, которая присутствует в сервис-деске.
Я сомневаюсь, что оператор должен принять звонок от пользователя, а потом тратить время на то, чтобы создавать обращение, заново заполнять в него все данные - кто обратился и т.п.

Либо кнопки должны быть эти, либо хотя бы возможность создания этих кнопок.
Если они есть в Customer Engagement Center, почему вы говорите, что нет возможности настройки их в продукте ITIL (он на той же платформе)

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

Преднастроенных процессов в данном продукте для CTI панели нет, но Вы можете их настроить самостоятельно.

Для того чтобы настроить действия CTI панели необходимо:

1. Настроить процесс по которому будут работать операторы
2. Зарегистрировать справочник "Действия CTI панели", который привязан к соответствующим объекту, странице редактирования
3. Указать в справочнике "Действия CTI панели" опции для оператора и процессы которые будут вызываться.

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

Есть несколько окон звонка. И есть несколько окон заказа, открытых из разных окон звонка. Как можно програмно найти окно заказа относящееся к текущему окну звонка. Или количество окон заказа, открытых из данного окна звонка. Или, если нельзя, узнать хотя бы, есть ли у данного окна звонка какие-то дочерние окна?

Нравится

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

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

Из "дочернего" окна можно узнать, есть ли у него родительское:

Self.Attributes('NotifyObject')

Из "родительского" посчитать кол-во "дочерних" окон в коробке нельзя.
Но ничто Вам не мешает при нажатию на кнопку создания нового заказа записывать в атрибут окна "Звонок" окно "Заказа":

ZakazWindow.Prepare();
ZakazWindow.Show();
Self.Attributes('ChildForms').push(ZakazWindow);

где

Self.Attributes('ChildForms') = [];

Вроде бы получилось.
Используется аттрибут окна заказа PerformedForms
При открытии окна заказа
wndSandBurn = ShowEditWindowEx(EditWindowUSI, Attributes, DefaultValues);
присваивается +
wndSandBurn.Attributes('PerformedForms') ='+';
При закрытии окна заказа присваивается -
Self.Attributes('PerformedForms') = '-';
...
wnd_BaseDBEditOnCloseQuery(Window, CanClose);

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

в wnd_CallEditScript
var Skolko = getPermission('wnd_OpportunityOrderEdit','wnd_CallEdit',Self.InstanceID);
if(Skolko > 0)
......

function getPermission(USI, USI2, RecordID) {
var Item;
for (var i = 0; i < WinCache_Windows.length; i++) {
Item = WinCache_Windows[i];
if (Item.USI == USI && Item.Instance.Attributes('NotifyObject').InstanceID == RecordID && Item.Instance.Attributes('PerformedForms') == '+')
return 1;

}
return 0;
}

Несколько модифицировав функцию, можно получать количество дочерних окон или конкретные данные из объекта.
Вопрос в чем: нет ли в таком подходе каких-то "подводных камней". При тестировании все нормально - окно видит свои дочерние окна и правильно реагирует, но мало ли...

Добрый день.

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

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

Простой способ звонить из карточки Контрагента и Контакта.
Используется десктопная версия Terrasoft (можно для BPM сделать подобным образом) и ip-АТС Oktell.

На поле значения средства связи ставится обработчик двойного нажатия (клика):

if ((edtCommunication1Type.DataField.DisplayValue=='Телефон') || (edtCommunication1Type.DataField.DisplayValue=='Мобильный')) {
var webAddress = "http://localhost:4059/callto?number="+edtCommunication1.Value;
var xmlHttpReq = new ActiveXObject("MSXML2.XMLHTTP.6.0");
xmlHttpReq.open("GET", webAddress, false);
xmlHttpReq.send();
}

Нравится

Поделиться

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