Переопределение алгоритма звонкa в BPM online 7.4

Добрый день, подскажите где искать алгоритм происходящий после нажатия на зеленую трубку в детали средства связи
http://goo.gl/It5cS1
необходимо добавить дополнительные параметры при создания звонка

Нравится

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

Нажатие на кнопку обрабатывается в CTIBaseCommunicationViewModel функцией onLinkClick: function()

Не нашел там такой функции, есть

/**
 * Совершает звонок по текущему номеру телефона.
 * @protected
 */
call: function() {
	var number = this.get("Number");
	var contact = this.get("Contact");
	var customerId = contact ? contact.value : this.get("Account").value;
	var entitySchemaName = contact ? "Contact" : "Account";
	this.sandbox.publish("CallCustomer", {
		number: number,
		customerId: customerId,
		entitySchemaName: entitySchemaName
	});
},

кто то может подсказать где принимается этот CallCustomer?

CallCustomer - в BaseCommunicationDetail

нашел только это в BaseCommunicationDetail

messages: {
	"CallCustomer": {
		mode: Terrasoft.MessageMode.PTP,
		direction: Terrasoft.MessageDirectionType.PUBLISH
	},
	"DoNotUseCommunication": {
		mode: Terrasoft.MessageMode.PTP,
		direction: Terrasoft.MessageDirectionType.PUBLISH
	}
},

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

Добрый день.
Если я правильно понял, речь идет о 7.4.0 (cti-панель находится слева).
Вы все верно нашли - отправляется сообщение "CallCustomer", c параметрами: номер, идентификатор абонента и название объекта (Контакт или Контрагент).

Обрабатывается сообщение в схеме CtiPanelPage, метод onCallCustomer:

/**
 * Обработчик события звонка клиенту.
 * @param numberInfo {Object} Информация о параметрах звонка.
 * @param numberInfo.number {String} Номер телефона клиента.
 * @param numberInfo.isConsultCall {Boolean} Консультационный звонок.
 * @param numberInfo.isCanvassCall {Boolean} Звонок по исходящей кампании.
 * @param numberInfo.customerId {String} Id записи клиента.
 * @param numberInfo.callCampaignId {String} Id исходящей кампании.
 * @param numberInfo.callCampaignTargetId {String} Id целевой аудитории исходящей кампании.
 * @param numberInfo.callActivityId {String} Id активности.
 * @private
 */
function onCallCustomer(numberInfo) {
	if (!Ext.isEmpty(ctiModel.get("CurrentCallNumber")) && !Ext.isEmpty(ctiModel.get("ConsultCallNumber"))) {
		return;
	}
	if (!Ext.isEmpty(ctiModel.get("CurrentCallNumber"))) {
		if (numberInfo.number === ctiModel.get("CurrentCallNumber")) {
			return;
		} else {
			numberInfo.isConsultCall = true;
		}
	}
	var customerId = numberInfo.customerId;
	if (!numberInfo.isConsultCall && Ext.isEmpty(ctiModel.get("CurrentCallNumber"))) {
		var callLaterControlContainer = Ext.getCmp("callLaterControlContainer");
		if (callLaterControlContainer.rendered && !callLaterControlContainer.el) {
			callLaterControlContainer.rendered = false;
		}
		ctiModel.set("isCanvassCall", numberInfo.isCanvassCall);
		ctiModel.set("callCampaignId", numberInfo.callCampaignId);
		ctiModel.set("callCampaignTargetId", numberInfo.callCampaignTargetId);
		ctiModel.set("callActivityId", numberInfo.callActivityId);
		caller = numberInfo.number;
		callerInfo = null;
		if (Terrasoft.isGUID(customerId)) {
			ctiModel.set("customerId", customerId);
		}
		ctiModel.dial(numberInfo.number);
	} else if (numberInfo.isConsultCall && Ext.isEmpty(ctiModel.get("ConsultCallNumber"))) {
		ctiModel.transfering();
		if (!ctiModel.set("isModalWindowOpened")) {
			ctiModel.showModalWindow();
		}
		if (Terrasoft.isGUID(customerId)) {
			ctiModel.set("consultCustomerId", customerId);
		}
		ctiModel.callConsultCustomer(numberInfo.number);
	}
}

Можете добавить дополнительные свойства в numberInfo и обработать их в расширенной схеме CtiPanelPage.

Добрый день, почти то что нужно, метод вызывается из детали CommunicationDetail, он отправляет сообщение CallCustomer, эту деталь добавили на страницу активности и вопрос собственно заключается в том как связать Актиность со звонком, в объекте Call есть поле ActivityId вот как туда передать Id активности из которой был сделан звонок, на каком этапе задаются параметры numberInfo не могу найти перекопал уже все файлы что мог заподозрить в связи со звонками

Олег, к сожалению на этапе совершения звонка, еще не существует записи в таблице Call. Она появится уже после того, как телефония отправит сообщение о начале звонка в cti-панель.
Вы можете сделать по аналогии с тем, как происходит сохранение ссылки на кампанию обзвона, а именно сохранить ссылку на ActivityId в модели в onCallCustomer, а затем записать собственно в объект звонка в методе updateCall схемы CtiPanelPage

updateCall: function(columnName, customerId) {
	// ...
	var activityId = ctiModel.get("activityId");
	if (activityId) {
		update.setParameterValue("Activity", activityId,
			Terrasoft.DataValueType.GUID);
		ctiModel.set("activityId", null);
	}
	update.execute();
},

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

спасибо, это понял, но вот последний вопрос как передать параметр activityid в numberinfo и собственно на модель? в подписке на сообщение CallCustomer в CtiPanelPage есть

ctiModel.set("callActivityId", numberInfo.callActivityId);

откуда он берет айди активности?

Собственно мы его передаем, когда отправляем сообщение CallCustomer откуда-либо:
1. http://www.community.terrasoft.ru/forum/topic/12519#comment-53353

this.sandbox.publish("CallCustomer", {
		number: number,
		customerId: customerId,
		entitySchemaName: entitySchemaName,
// Передаем идентификатор активности
		callActivityId: <id активности>
});

2. Далее http://www.community.terrasoft.ru/forum/topic/12519#comment-53359

function onCallCustomer(numberInfo) {
	// ...
	// Это уже есть
	ctiModel.set("callActivityId", numberInfo.callActivityId);
	// ...
}

3. И наконец наш http://www.community.terrasoft.ru/forum/topic/12519#comment-53372

updateCall: function(columnName, customerId) {
        // ...
        var activityId = ctiModel.get("callActivityId");
        if (activityId) {
                update.setParameterValue("Activity", activityId,
                        Terrasoft.DataValueType.GUID);
                ctiModel.set("callActivityId", null);
        }
        update.execute();
},

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

Ну получение id активности уже зависит от того, как Вы реализовали деталь в карточке Активности.
Для контактов или контрагентов достаточно из модели взять атрибут "Contact" или "Account" соответственно. Могу предположить, что у Вас это какой-нибудь "Activity".

Артем, я не много не так выразился, наверное, в CTIBaseCommunicationViewModel.js мы собираем переменные для сообщения, вот как туда передать айди активности, к примеру там есть обращение к this но это обращение к объекту на детали

var number = this.get("Number");
var contact = this.get("Contact");

Олег, мы немного отошли от темы звонка и перешли к теме создания детали в карточке активности.
CTIBaseCommunicationViewModel - это view-модель средства связи, которая создается в NUI.BaseCommunicationDetail. Там же инициализируются атрибуты модели, такие как CommunicationTypes, DetailColumnName, PhoneCommunicationTypes. Вот где-то там Вам нужно также передать активность в качестве дополнительного атрибута, который затем читать в CTIBaseCommunicationViewModel.

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