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

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

Для бандла service сейчас пытаюсь реализовать деталь с редактируемым реестром, чтобы можно было указывать в заявке несколько значений из справочника. Всем известно, что, когда пытаешься добавить в деталь новое значение, то вызывается метод, который сохраняет родительскую запись, так как запись детали обязательно должна быть связана с родительской записью. Можно как-то добавить в деталь запись, не вызывая метод, который сохраняет родителя, но при этом, чтобы после сохранения родителя, в детали все корректно связалось? Как-то же это реализовано для файлов например.

Нравится

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

Это ещё реализовано и в Средствах связи

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

В средствах связи, схеме ContactCommunicationDetailV2 добавленные и удалённые складываются в две коллекции Collection и DeletedItems и при сохранении из них извлекаются и идут на сервер одним составным запросом:

deleteItem: function(item) {
	var deletedItems = this.get("DeletedItems");
	var collection = this.get("Collection");
	collection.removeByKey(item.get("Id"));
	deletedItems.addItem(item);
},
 
addItem: function(tag) {
	if (this.get("IsDetailCollapsed")) {
		return;
	}
	var communicationTypes = this.get("CommunicationTypes");
	var communicationType = communicationTypes.get(tag);
	var newItem = this.Ext.create("Terrasoft.BaseCommunicationViewModel", {
		entitySchema: this.entitySchema,
		columns: this.columns
	});
	newItem.set("CommunicationTypes", communicationTypes);
	newItem.sandbox = this.sandbox;
	newItem.setDefaultValues(function() {
		newItem.set("CommunicationType", {
			value: communicationType.get("Id"),
			displayValue: communicationType.get("Name")
		});
		newItem.set("Contact", {
			value: this.get("MasterRecordId")
		});
		var itemKey = newItem.get("Id");
		var collection = this.get("Collection");
		collection.add(itemKey, newItem);
		this.changeCardPageButtonsVisibility(true);
	}, this);
	return newItem;
},
 
...
 
getDeleteItemsQueries: function() {
	var deletedItems = this.get("DeletedItems");
	var deleteQueries = [];
	deletedItems.each(function(item) {
		var primaryColumnValue = item.get(item.primaryColumnName);
		var deleteQuery = item.getDeleteQuery();
		deleteQuery.enablePrimaryColumnFilter(primaryColumnValue);
		deleteQueries.push(deleteQuery);
	}, this);
	return deleteQueries;
},
 
getSaveItemsQueries: function() {
	var collection = this.get("Collection");
	var saveQueries = [];
	collection.each(function(item) {
		if (item.isChanged() && item.validate()) {
			saveQueries.push(item.getSaveQuery());
		}
	}, this);
	return saveQueries;
},
 
...
 
save: function() {
	var restrictionsQuery = this.getSaveRestrictionsQuery();
	var queries = restrictionsQuery ? [restrictionsQuery] : [];
	var saveQueries = this.getSaveItemsQueries();
	queries = queries.concat(saveQueries);
	var deleteQueries = this.getDeleteItemsQueries();
	queries = queries.concat(deleteQueries);
	if (Ext.isEmpty(queries)) {
		this.publishSaveResponse({
			success: true
		});
		return true;
	}
	var batchQuery = Ext.create("Terrasoft.BatchQuery");
	Terrasoft.each(queries, function(query) {
		batchQuery.add(query);
	}, this);
	batchQuery.execute(this.onSaved, this);
	return true;
},
 
onSaved: function(response) {
	var message = response.ResponseStatus && response.ResponseStatus.Message;
	if (response.success && !message) {
		var deletedItems = this.get("DeletedItems");
		var collection = this.get("Collection");
		collection.each(function(item) {
			item.isNew = false;
			item.changedValues = null;
		}, this);
		deletedItems.clear();
		this.publishSaveResponse(response);
	} else {
		this.publishSaveResponse({
			success: false,
			message: this.getValidationMessage(message)
		});
	}
},

 

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

При создании портального сообщения из БП происходит его создание во вкладке "Хронология" обращения, но само сообщение не появляется во вкладке "Обработка".

Каким образом перенести сообщение в обработку? (как я понимаю, оно просто не публикуется, хотя признак установлен)

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

Нравится

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

Попробуйте найти в PortalMessage запись о корректно отображаемом пользователям портала сообщении и сравнить с Вашим, создаваемым в БП. Возможно, отличаются значения полей (в частности, HideOnPortal и IsNotPublished) или в связанной таблице прав доступа не хватает разрешений портальным пользователям на эту запись.

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

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

"Хронология" (поле опубликован так же выставлял как "Да"). Сообщение не отображается в "Обработке" нигде (ни в системе, ни на портале, ни под один пользователем)

Проблема найдена - не было указано значение поля

"Уникальный идентификатор схемы". Нет ли ни у кого решения как можно получать данный идентификатор стандартными методами из БП?

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

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

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

Так он же везде одинаковый для одинакового раздела, независимо от версии и даже вертикали.

Если Вам нужно именно программно по названию объекта, то:

var ContactSchemaUId = UserConnection.EntitySchemaManager.GetInstanceByName("Contact").UId;

 

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

Каким образом возможно протестировать портал самообслуживания в рамках тест-драйва продуктов service? В тестовых системах в наличии только лицензия bpmonline ITIL service customer portal on-demand, а Self-Service Portal отсутствует.

Так же есть следующий вопрос - мобильное приложение не поддерживает портальных пользователей. Планируется ли мобильно приложение для портала самообслуживания?

Нравится

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

Портал самообслуживания доступен для таких продуктов: Service customer center, Service enterprise и Financial Services customer journey. Дополнительных лицензий не нужно, на демо-версии уже есть «Портальный пользователь 1» с доступом на Self Service Portal:

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

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

Всем привет!

Стоит следующая задача: заменить фильтр, на основании которого отображается список в виджете "Мои обращения" (Список обращений пользователя портала) на Главной странице портала?

Учитывая, что

1. замещение клиентских модулей запрещено

2. хочется обойтись "малой кровью"

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

4. список формируется на основании подгружаемого config

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

 

Нравится

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

Эта логика реализована в схеме «Список обращений пользователя портала» (UserCasesListModule) в функции initConfig: function(). Вероятно, проще действительно не трогать базовый, а скопировать, сделать в отдельной схеме свой аналог с нужным фильтром, а затем в дизайнере  панели итогов «Главная страница портала» указать его в свойствах блока.

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

благодарю за ответ

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

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

 

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

Подскажите, пожалуйста, где это делается

Нравится

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

Добрый день!
Перейти в раздел обращений, из него в мастер раздела, далее вкладка "Портал" и нажать кнопку "Редактировать страницу".
А там уже добавлять, изменять поля

Добрый день!
Перейти в раздел обращений, из него в мастер раздела, далее вкладка "Портал" и нажать кнопку "Редактировать страницу".
А там уже добавлять, изменять поля

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

 

А у обработчика ее нет. Как можно ее вернуть?

Разверните на отдельном сервере вашу версию bpmonline и заберите оттуда все что вам нужно востановить....

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

Всем привет,

Есть кусок кода, который корректно работает в системе:

var hash = NetworkUtilities.getEntityUrl("SomeObject", record.get("SomeObject.Id"));
this.sandbox.publish("PushHistoryState", {hash: hash});

Но в портале самообслуживания hash получается пустым и ничего не происходит. У пользователя есть доступ к объекту - он видит записи если открыть их напрямую (объект прописан в справочниках доступа объектов для портальных пользователей).

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

Нравится

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

Проверьте что у пользователей портала есть права на доступ к объекту (хотя бы на чтение), а так же что ваш объект добавлен в справочник  [Список объектов, доступных пользователям портала]  и что нужные колонки указаны а справочнике [Список доступных полей объектов на портале]

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

Код этой функции getEntityUrl можно открыть в конфигурации, в схеме NetworkUtilities:

/**
 * Creates a relative URL to open the card of the entity.
 * @throws {Terrasoft.ArgumentNullOrEmptyException} Throws an exception if not specified the schema name or
 * the entity ID.
 * @inheritdoc NetworkUtilities#getEntityConfigUrl
 */
getEntityUrl: function(config) {
	if (arguments.length > 1) {
config = {
	entitySchema: arguments[0],
	primaryColumnValue: arguments[1],
	typeColumnValue: arguments[2],
	operation: arguments[3]
};
	}
	let url = "";
	var entityConfig = this.getEntityConfigUrl(config);
	if (entityConfig) {
url = Terrasoft.combinePath(
	entityConfig.cardModule,
	entityConfig.cardSchema,
	entityConfig.operation,
	entityConfig.primaryColumnValue
);
	}
	return url;
},

А она вызывает getEntityConfigUrl:

/**
 * Creates a configuration object values for the U R L to a card entity.
 * @throws {Terrasoft.ArgumentNullOrEmptyException} Throws an exception if not specified
 * the schema name or the entity ID.
 * @param {Object} config Config object.
 * @param {String} config.entitySchema The name or ID of the schema entity.
 * @param {String} [config.entitySchemaName] The name of the schema entity. Alias for @entitySchema.
 * @param {String} config.primaryColumnValue The entity identifier.
 * @param {String} [config.typeColumnValue] The value of the column type.
 * @param {String} [config.typeId] The value of the column type. Alias for @typeColumnValue.
 * @param {String} [config.operation] Operation.
 * @return {Object} Returns the configuration object values for the U R L to a card entity.
 */
getEntityConfigUrl: function(config) {
	const configArg = arguments.length === 1;
	const entitySchema = configArg ? config.entitySchema || config.entitySchemaName : arguments[0];
	const primaryColumnValue = configArg ? config.primaryColumnValue : arguments[1];
	const typeColumnValue = configArg ? config.typeColumnValue || config.typeId : arguments[2];
	const operation = configArg ? config.operation : arguments[3];
	var entitySchemaName = Terrasoft.isGUID(entitySchema)
? this.getEntitySchemaName(entitySchema)
: entitySchema;
	if (!entitySchemaName) {
throw Ext.create("Terrasoft.ArgumentNullOrEmptyException");
	}
	var moduleStructure = Terrasoft.ModuleUtils.getModuleStructureByName(entitySchemaName);
	var entityStructure = Terrasoft.ModuleUtils.getEntityStructureByName(entitySchemaName);
	if (!entityStructure && !moduleStructure) {
return null;
	}
	var pages = entityStructure.pages;
	if (typeColumnValue && moduleStructure && moduleStructure.attribute && !Ext.isEmpty(pages)) {
var typePage = Terrasoft.where(pages, {"UId": typeColumnValue});
pages = Ext.isEmpty(typePage) ? pages : typePage;
	}
	var cardModule = moduleStructure && moduleStructure.cardModule ? moduleStructure.cardModule : "CardModuleV2";
	var cardSchema = pages[0].cardSchema;
	var configUrl = {
cardModule: cardModule,
cardSchema: cardSchema,
entitySchemaName: entitySchemaName,
operation: operation || Terrasoft.ConfigurationEnums.CardOperation.EDIT,
primaryColumnValue: primaryColumnValue
	};
	return configUrl;
},

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

Проверьте что у пользователей портала есть права на доступ к объекту (хотя бы на чтение), а так же что ваш объект добавлен в справочник  [Список объектов, доступных пользователям портала]  и что нужные колонки указаны а справочнике [Список доступных полей объектов на портале]

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

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

Спасибо за ответ.

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

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

Тогда только отлаживатся и смотреть почему возращает пусто или сделать костыль (для портала зашить нужный url)

Ещё точнее, на портале в JS объект Terrasoft.configuration.ModuleStructure содержит только 3 стандартных портальных раздела, и для SomeObject функция ничего не возвращает. Посмотреть наполнение на портале и в обычной системе можно, введя в консоли браузера Terrasoft.configuration.ModuleStructure.

Логика наполнения списка реализована в C#-схеме ConfigurationSectionHelper.

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

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

Здравствуйте, в обращении в стандартном режиме работы присутствует подраздел "Информация по обращению". 

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

Вроде понимаю что нужно отредактировать "PortalCasePage", но не могу додумать откуда взять источник.

Нравится

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

Здравствуйте! Источник Case  - http://prntscr.com/mw6k0g

Нигрескул Алексей, я так понял нужно добавить еще одну деталь в Details помимо VisaDetailV2bad5afcc, как определить эту деталь?

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

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

Добрый день. 

BPM service, облако. 

Столкнулся со следующей проблемой - пользователи портала не видят сообщения (email) в обращениях на Портале. 

Пересмотрел, кажется, все, что можно. Помогите разобраться где этот момент настраивается. 

Нравится

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

Необходимо с помощью процесса на добавление/изменение "Activity" и добавление в объект "Email message" (у нас в процессе на все три события)  раздавать дополнительно права на e-mail сообщения (Activity) нужным пользователям портала (например, мы выдавали контакту инцидента и его руководителю).

И посмотрите, есть ли на чтение объекта Activity права у All portal users

Необходимо с помощью процесса на добавление/изменение "Activity" и добавление в объект "Email message" (у нас в процессе на все три события)  раздавать дополнительно права на e-mail сообщения (Activity) нужным пользователям портала (например, мы выдавали контакту инцидента и его руководителю).

И посмотрите, есть ли на чтение объекта Activity права у All portal users

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

Версия 7.12.4.

Добавил деталь в р. "Обращения портала"
При инициализации детали получаю ошибку: 

После отладки выявлено, что ошибка связана с вызовом не существующего сallback в методе initDetailRunProcessButtonMenu миксина  ProcessEntryPointUtilities.
В результате этой ошибки деталь не отображается в карточке Обращения на портале.

 

 

Нравится

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

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

/**
 * Initializes "Run process" menu items in detail.
 * @param {Function} callback Callback function.
 * @param {Object} scope Execution context.
 * @protected
 */
initDetailRunProcessButtonMenu: function(callback, scope) {
	var processButtonMenu = this.get("RunProcessButtonMenuItems");
	if (!processButtonMenu) {
		processButtonMenu = this.Ext.create("Terrasoft.BaseViewModelCollection");
		this.set("RunProcessButtonMenuItems", processButtonMenu);
	}
	if (Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection()) {
		this._initDetailAvailableProcessList(processButtonMenu, callback, scope);
	} else {
		callback.call(scope);
	}
},

Возможно, для стандартной детали до else и не доходит.

Илья, добрый день.
В том то и дело, что 

Terrasoft.ProcessEntryPointUtilities.getCanRunProcessFromSection() и проверяет, не является ли пользователь пользователем портала, и в интерфейсе сотрудника возвращает true, и как следствие выполняется this._initDetailAvailableProcessList(processButtonMenu, callback, scope);

НО если пользователь является пользователем портала, то выполняется callback.call(scope);, а callback в этот метод не передается и равен undefind

Т.о. при выводе детали для пользователя портала  получаем ошибку

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

Мотков Илья,

Деталей на портале нет. 
Вопрос в том, почему в initDetailRunProcessButtonMenu не передаётся callback

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

Мотков Илья,

Метод initDetailRunProcessButtonMenu  вызывается в BaseGridDetailV2 в методе initData и не принимает аргументы (см. https://yadi.sk/i/UoJ5M8kHo9s1kw)

Но в условии else вызывается callback.call(scope);, который по определению вернёт ошибку( т.к. initDetailRunProcessButtonMenu  не принимает аргументов)

Сам метод initDetailRunProcessButtonMenu   описан в схеме-миксине ProcessEntryPointUtilities

Я пытаюсь указать на баг базовой функциональности, который ограничивает использование деталей на портале пользователей.

Для себя временной решение я уже нашёл, но хотелось бы получить исправление в коробочной версии.

Либо переделайте initData, чтобы передавала в функцию эти два параметра, либо в самой initDetailRunProcessButtonMenu добавьте проверку на заполненность параметра, либо, если initData — это единственное место в системе, где функцию initDetailRunProcessButtonMenu вызывают и else не сможет отработать в принципе, исключите нижнюю ветвь.

Мотков Илья,

Илья, решение я уже нашёл (заместил 

BaseGridDetailV2 и метод initDetailRunProcessButtonMenu.)
Целью этой публикации на community является обратить внимание поддержки Terrasoft на не корректную реализацию метода initDetailRunProcessButtonMenu и на проблемы, которые, эта реализация вызывает. 
Чтобы это по возможности было исправлено в следующих релизах.

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

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

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

Добрый день. Можно ли в портале сделать фильтр, который в системе слева настраивается?

Нравится

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

К сожалению, в Сustomer Portal для фильтрации можно использовать только быстрый фильтр.

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