Вопрос

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

Столкнулся с проблемой фильтрации в разделе активностей в списочном представлении.

Создал ModuleConfig, прописал в нем фильтрацию, название модуля добавил в манифест, но при отработке вываливается ошибка - http://prntscr.com/nns86h
 

Terrasoft.sdk.Module.addFilter("Activity", Ext.create("Terrasoft.Filter", {
	property: "Owner",
	value: Terrasoft.CurrentUserInfo.contactId
}));

так же не работает сортировка - http://prntscr.com/nns8sc
 

Terrasoft.sdk.GridPage.setOrderByColumns("Activity", {
	column: "StartDate",
	orderType: Terrasoft.OrderTypes.DESC
});

В чем может быть проблема?

У меня такой же вопрос

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

Судя по тексту сообщения, код пытается сделать вставку (push) элемента в массив, а массив равен null. Где именно и почему это происходит, можно увидеть, открыв скрипты filter.js, sdk-utils.js и module-sdk.js в указанных на экране номерах строк.

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

Всем добрый день! Столкнулся с проблемой, в замещенной схеме CtiPanel не работает UpdateQuery.

define("CtiPanel", [],
	function() {
		return {
			entitySchemaName: "Call",
			messages: {
				"WaSendCallDataToContact":{
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.PUBLISH
				},
				"WaSetDataToCall": {
					mode: Terrasoft.MessageMode.PTP,
					direction: Terrasoft.MessageDirectionType.SUBSCRIBE
				}
			},
			mixins: {},
			attributes: {
				WaRelationEntities: { dataValueType: Terrasoft.DataValueType.CUSTOM_OBJECT }
			},
			methods: {
				init: function() {
					this.callParent(arguments);
					this.processMessage();
				},
				onCallSavedEvent: function(call) {
					this.callParent(arguments);
					var relations = this.get("WaRelationEntities");
					if(relations && relations.length > 0) {
						var callId = call.databaseUId;
						this.getUpdateQueryCall(callId, relations);
						this.set("WaRelationEntities", null);
					}
					this.sandbox.publish("WaSendCallDataToContact", call, ["_WaSendCallDataToContact"]);
				},
 
				processMessage: function(){
					this.sandbox.subscribe("WaSetDataToCall", this.onMessageSubscribe.bind(this), this);
				},
 
				onMessageSubscribe: function(args) {
					this.set("WaRelationEntities", args);
					window.console.log("onMessageSubscribe(args): ", args);
				},
 
				getUpdateQueryCall: function (id, relations){
					debugger;
					var updateQuery = Ext.create("Terrasoft.UpdateQuery", {
						rootSchemaName: this.entitySchemaName
					});
					var filters = updateQuery.filters;
					filters.addItem(this.Terrasoft.createColumnFilterWithParameter(this.Terrasoft.ComparisonType.EQUAL, "Id", id));
					for(var i = 0; i < relations.length; i++) {
						updateQuery.setParameterValue(relations[i].entitySchemaName, relations[i].value, relations[i].type);
					}
					updateQuery.exequte(this.updateQueryCallBack, this);
				},
				updateQueryCallBack: function(result) {
					if(!result.success) {
						window.console.error(result);
						return;
					}
				}
			},
			diff: []
		};
	}
);

ошибки следующие - http://prntscr.com/nh5uws
В чем может быть проблема?

У меня такой же вопрос

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

Алексей,

у Вас же в консоли все написано: 

updateQuery.exequte is not a function

Нужно написать updateQuery.exeсute

 

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

)) Благодарю, переработал наверное, нужен отдых

странно все равно не сработало даже после изменения, http://prntscr.com/nh7lpa
http://prntscr.com/nh7opx

 

Подключены ли следующие модули "ext-base", "terrasoft", "sandbox" как Ext, Terrasoft, sandbox ?

//те в самом верху должно быть

define("CtiPanel", ["ext-base", "terrasoft", "sandbox"], function(Ext, Terrasoft, sandbox)

 

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

Всем добрый день! 

Реализовал в заказе/лиде кнопку звонка - http://prntscr.com/ngpc8u
звонок вызываю через публикацию CallCustomer:
 

this.sandbox.publish("CallCustomer", {
					number: mobilePhone, 
					customerId: Terrasoft.SysValue.CURRENT_USER.value, 
					entitySchemaName: "Lead",
					callRelationFields: undefined
				});

 Какие параметры необходимо добавить что бы в звонке сохранился либо Лид/Заказ  + Контакт заказа если звоним из Заказа - http://prntscr.com/ngpenx ?
Или необходимо использовать другой метод?

Заранее благодарен.

У меня такой же вопрос

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

Добрый день!
Попробуйте передать данные поля в callRelationFields. Это массив из объектов, типа:

{
	name: columnName,
	value: columnValue,
	type: this.Terrasoft.DataValueType.GUID
}

 

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

this.sandbox.publish("CallCustomer", {
					number: mobilePhone, 
					customerId: Terrasoft.SysValue.CURRENT_USER.value, 
					entitySchemaName: "Lead",
					callRelationFields: [{
						name: "Lead",
						value: leadId,
						type: this.Terrasoft.DataValueType.GUID
					}]
				});

Подставил параметры, не помогло, что не так?

Нигрескул Алексей,
Посмотрите, какие поля приходят в метод updateCallByIdentificationData схемы CtiPanelIdentificationUtilities. Может быть там возникают ошибки

Насколько я понимаю в customerId должна быть Id вашего Lead  с которого совершается звонок те набор полей customerId и EntitySchemaName вы определяете схему и идентификатор записи к которой будут добавлен набор полей из callRelationFields

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

Передавал  customerId: leadId, entitySchemaName: "Lead" не помогло

Добавить комментарий

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

Продебажил данный метод, он даже не срабатывает при вызове через публикацию CallCustomer.

Перед отправкой сообщения сохраните ваш конфиг в "AdvisedIdentifiedSubscriberInfo", те

 

this.set("AdvisedIdentifiedSubscriberInfo", {

number: _nomer, 
                    customerId: this.get("Id"), 
                    entitySchemaName: "Lead",
                    callRelationFields: ...

});

 

Если не поможет (Насколько понимаю каждая интеграция с телефонией реализована по своему, возможно что запись в базу информации о звонке реализована напрямую из dll инсертами) то посмотрите что поступает в БД через sql профайлер и что за запросу идут через сервисы во вкладке Netwoork браузера. Возможно вам придется  найти Id звонка и обновить нужные вам поля в объекте.

Благодарю, попробую. Id звонка не проблема получить, переопределил схему CtiPanel, переопределил метод onCallSavedEvent и в нем по сути получаю звонок, и тут можно пушить в sandbox и подписываться там где нужно, ну это теоретически, Нужно только подумать как отловить нужную публикацию. Телефония Webitel. Может есть идеи по данному поводу, как отлавливать звонок, вот получаю лог звонка из переопределенного метода onCallSavedEvent - http://prntscr.com/ngvqpx. Просмотрел объект зацепится не за что, у кого какие идеи,заранее благодарен!

Вы пробовали сохранить в this.get("AdvisedIdentifiedSubscriberInfo") конфиг звонка включая поля которые вам нужно сохранить в карточке звонка?

Посмотрите при  сохранении что попадает в identificationFieldsData

 

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

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

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

Заранее благодарен!

У меня такой же вопрос

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

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

Механизм открытия карточки из очереди реализуется в БП «Обработка обращений из очереди в Едином окне», недавно обсуждавшемся.

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

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

Имеются две среды, две базы на двух разных машинах. Базы отличаются друг от друга. На одной машине у меня есть пакеты разработки, которые я могу менять. Как мне их правильно перенести на другую базу на другую машину, чтобы они там остались доступны мне для изменения? SVN Server есть

У меня такой же вопрос

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

Попробуйте настроить работу с SVN для обоих сред. Подробнее смотрите здесь.

Попробуйте настроить работу с SVN для обоих сред. Подробнее смотрите здесь.

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

то есть разработка далее будет идти только в файловой системе?

Линар Аминев,

А что Вас смущает в разработке в файловой системе?

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

да в целом ничего. будем значит в файловой системе. спасибо за ответ)

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

Реализовал разделение календаря по сотрудникам в фильтре через кучу diff. Встал вопрос - как наполнить каждый разными данными?
По умолчанию activityCollection планировщика указан как ScheduleGridData. Соответственно, на каждый календарь на странице создаю ScheduleGridData0, ScheduleGridData1, ScheduleGridData2 и так далее и подставляю эти значения в каждый activityCollection, но календари становятся вообще пустыми. Я так понимаю, вопрос в методах отрисовки, но тогда придется переписывать половину CRM.
Подскажите, как каждый календарик наполнить своим содержимым или что нужно изменить?

Вот пример одного из календарей

{
            "operation": "insert",
            "name": "Schedule0",
            "parentName": "DataViewsContainer",
            "propertyName": "items",
            "values": {
                 "id": "ActivitySectionV2Scheduler0",
                 "selectors": {"wrapEl": "#ActivitySectionV2Scheduler0"},
                 "itemType": Terrasoft.ViewItemType.SCHEDULE_EDIT,
                 "visible": {"bindTo": "isSchedulerVisible0"},
                 "startHour": Terrasoft.SysSettings.cachedSettings.SchedulerTimingStart,
                 "displayStartHour": Terrasoft.SysSettings.cachedSettings.SchedulerDisplayTimingStart + "-00",
                 "dueHour": Terrasoft.SysSettings.cachedSettings.SchedulerTimingEnd,
                 "timeScale": {"bindTo": "getTimeScale"},
                 "period": {"bindTo": "getSchedulerPeriod"},
                 "timezone": [{}],
                 "startDate": null,
                 "dueDate": null,
	         "activityCollection": {"bindTo": "ScheduleGridData0"},
                 "selectedItems": {"bindTo": "SelectedRows"},
                 "changeSelectedItems": {"bindTo": "onChangeSelectedItems"},
                 "scheduleItemDoubleClick": {"bindTo": "onScheduleItemDoubleClick"},
                 "scheduleItemTitleMouseOver": {"bindTo": "scheduleItemTitleMouseOver"},
                 "scheduleItemTitleClick": {"bindTo": "scheduleItemTitleClick"},
                 "change": {"bindTo": "changeScheduleItem"},
                 "selection": {"bindTo": "SchedulerSelection"},
                 "floatingItemsCollection": {"bindTo": "SchedulerFloatItemsCollection"},
                 "selectionKeyPress": {bindTo: "onSelectionKeyPress"},
                 "floatingItemReady": {"bindTo": "onFloatingItemReady"},
                 "selectionKeyPressSymbols": {"bindTo": "SchedulerSelectionPressedKeys"},
                 "itemBindingConfig": {
                     "itemId": {"bindTo": "Id"},
                     "title": {"bindTo": "getScheduleItemTitle"},
                     "changeTitle": {"bindTo": "onTitleChanged"},
                     "startDate": {"bindTo": "StartDate"},
                     "changeStartDate": {"bindTo": "onStartDateChanged"},
                     "dueDate": {"bindTo": "DueDate"},
                     "changeDueDate": {"bindTo": "onDueDateChanged"},
                     "status": {"bindTo": "getScheduleItemStatus"},
                     "changeStatus": {"bindTo": "onStatusChanged"},
                     "background": {"bindTo": "Background"},
                     "fontColor": {"bindTo": "FontColor"},
                     "isBold": {"bindTo": "IsBold"},
                     "isItalic": {"bindTo": "IsItalic"},
                     "isUnderline": {"bindTo": "IsUnderline"},
                     "markerValue": {"bindTo": "getScheduleItemHint"}
                   },
                   "floatingItemBindingConfig": {
                        "caption": {"bindTo": "getSimpleModuleCaption"},
                        "width": {"bindTo": "getSimpleModuleWidth"}
                   }
}

 

У меня такой же вопрос

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

Смотрите, как реализовано расписание для нескольких пользователей в дополнении «Advanced schedule for bpm'online». 

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

Добрый вечер, сейчас встала необходимость размножить  календарь на странице активностей, чтобы в каждом отображался только один сотрудник (то есть, допустим, в фильтрах 3 сотрудника - значит, выводится 3 разных календаря) С системой работал, но сейчас встал на общем понимании того, как это сделать - изучение кода родителей не помогло.
Подскажите, пожалуйста, хотя бы в 2-3 строчках, общую идею куда копать чтобы это реализовать, заранее огромное спасибо!

У меня такой же вопрос

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

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

 

 

Возможно вам будут полезны эти приложения 1 2 3 доступные на меркетплэйсе

 

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

 

 

Возможно вам будут полезны эти приложения 1 2 3 доступные на меркетплэйсе

 

В первом, Advanced schedule for bpm'online, как раз есть то, что Вы хотите:

Дополнение платное, но есть «тест-драйв», можно установить и посмотреть, как оно сделано.

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

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

Кто нибудь сталкивался с такой проблемой:

Сайт развернут локально. Создаем деталь мобильного приложения через мастер, схемы создались - https://prnt.sc/n6surw
Фиксирую в СВН  - http://prntscr.com/n6svs3
Фиксация проходит успешно - http://prntscr.com/n6svyk
Результат в Svn зафиксировались только метаданные - http://prntscr.com/n6swjg 
http://prntscr.com/n6sx1x 
http://prntscr.com/n6sx6r
 

У меня такой же вопрос

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

Попробуйте так. Фиксируйте в свн 2 раза подряд. Перый раз уедут метаданные, второй раз - все остальное. Мы с этим сталкиваемся регулярно, но решения пока нет...

Попробуйте так. Фиксируйте в свн 2 раза подряд. Перый раз уедут метаданные, второй раз - все остальное. Мы с этим сталкиваемся регулярно, но решения пока нет...

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

Всем доброго времени суток!
Подскажите как можно передать в карточку редактирования нового заказа некоторых параметров - http://prntscr.com/n0jpjt ?
Для открытия карточки редактирования использую:
 

var config = {
			isStartRecord: true,
			pageSchemaName: "MobileOrderEditPage"
		};
		Terrasoft.util.openEditPage("Order", config);

 

У меня такой же вопрос

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

См. в MobilePhoneCallLogPage:

 onSaveButtonButtonTap: function() {
  var modelConfig = Terrasoft.ApplicationConfig.getModelConfig("Activity");
  var requiredModels = modelConfig.RequiredModels;
  Terrasoft.StructureLoader.loadModels({
   modelNames: requiredModels,
   success: function() {
    this.createCallActivity(function() {
     var arrangeActivityToggle = this.getArrangeActivityToggle();
     var toArrange = arrangeActivityToggle.getValue();
     var record = this.record;
     this.back();
     if (toArrange) {
      setTimeout(function() {
       var config = {
        defaultRecordData: {}
       };
       if (Ext.isString(this.activityLinkColumnNames)) {
        config.defaultRecordData[this.activityLinkColumnNames] = record;
       } else {
        for (var i = 0, ln = this.activityLinkColumnNames.length; i < ln; i++) {
         var linkColumnNameConfig = this.activityLinkColumnNames[i];
         var columnName = linkColumnNameConfig.activityColumnName;
         var columnValue = record.get(linkColumnNameConfig.parentColumnName);
         config.defaultRecordData[columnName] = columnValue;
        }
       }
       Terrasoft.util.openEditPage("Activity", config);
      }.bind(this), 500);
     }
    }.bind(this));
   },
   scope: this
  });
 },

 

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

Всем доброго времени суток!
Есть задача при изменении кол-ва продуктов или же изменении продукта в детали Продукт в заказе просчитывать Amount и TotalAmount. Реализую данную задачу через пользовательское бизнес правило:
 

Terrasoft.sdk.Model.addBusinessRule("OrderProduct", {
	name: "WaOrderProductAmountValidatorRule",
	ruleType: Terrasoft.RuleTypes.Custom,
	triggeredByColumns: ["Quantity", "Product"],
	events: [Terrasoft.BusinessRuleEvents.ValueChanged, Terrasoft.BusinessRuleEvents.Save],
	executeFn: function(model, rule, column, customData, callbackConfig) {
		window.console.info(model);
		debugger;
		var product = model.get("Product");
		if ((!product) || Ext.isEmpty(product)) {
			model.set("Price", 0, true);
			model.set("TotalAmount", 0, true);
			model.set("Amount", 0, true);
		} else {
			var quantity = model.get("Quantity");
			var price = product.get("Price");
			var amount = quantity * price;
			model.set("Amount", amount, true);
			model.set("TotalAmount", amount, true);
		}
		Ext.callback(callbackConfig.success, callbackConfig.scope);
	}
});

Но почему то значение цены продукта возвращает null:
 

{
	"modified":{
		"Id":"fbfb2d62-4439-486b-ae2f-b360f9e899f8"
	},
	"raw":{},
	"stores":[],
	"data":{
		"Id":"1fd85496-4cc0-485c-ad37-bb91857e65df",
		"Name":"Гидрогелевая маска для лица WOW Mask",
		"ProcessListeners":null,
		"Price":null,
		"Active":false,
		"IsArchive":false
	},
	"_data":{
		"Id":"1fd85496-4cc0-485c-ad37-bb91857e65df",
		"Name":"Гидрогелевая маска для лица WOW Mask",
		"ProcessListeners":null,
		"Price":null,
		"Active":false,
		"IsArchive":false
	},
	"id":"fbfb2d62-4439-486b-ae2f-b360f9e899f8",
	"internalId":"fbfb2d62-4439-486b-ae2f-b360f9e899f8",
	"phantom":true,
	"dirty":true
}

Хотя значение цены есть - http://prntscr.com/my9x2o

У меня такой же вопрос

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

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

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

    var additionalProductColumns = ["Price", /*прочие колонки*/];
    var productQueryConfig = Terrasoft.sdk.LookupGridPage.getQueryConfig("Product");
    Terrasoft.sdk.LookupGridPage.updateQueryConfigColumns(null, {columns: additionalProductColumns}, productQueryConfig);

Либо можно для converFuction первичной или вторичной колонки добавить её в LookupGridPage.

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

var controller = Terrasoft.app.getControllerInstances()["MyController"];
//Можно задебажиться и посмотреть, какие экземпляры контроллеров есть, среди них должен быть нужный
var control = controller.getFieldByName("MyColumn", record);
control.setValue(value);

Или ещё вариант:

var control = Ext.getCmp("{ViewId}_{PageType}_{ColumnName}_Column");
// {ViewId} - id представления, {PageType} - тип страницы Edit или Preview, {ColumnName} - название колонки, например AccountPage_Edit_AlternativeName_Column
control.setValue(value);

 

Бершеда Д. Н.,

 Здравствуйте! Я настроил кастомное правило и все хорошо изменяется, в данном случае сумма в зависимости от цены и кол-ва товаров. Вопрос в другом, не видит значение цены продукта, вот пример:
Есть заказ с продуктами -

http://prntscr.com/mz1088, меняю кол- во продукта срабатывает правило - http://prntscr.com/mz10kr
Мне возвращает цену продукта null - http://prntscr.com/mz10vd
Почему так происходит? В манифест зависимости добавил.

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

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

    var additionalProductColumns = ["Price", /*прочие колонки*/];
    var productQueryConfig = Terrasoft.sdk.LookupGridPage.getQueryConfig("Product");
    Terrasoft.sdk.LookupGridPage.updateQueryConfigColumns(null, {columns: additionalProductColumns}, productQueryConfig);

Либо можно для converFuction первичной или вторичной колонки добавить её в LookupGridPage.

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