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



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

 

2 часа (120 минут) буду зашивать в системную настройку (чтобы можно было варьировать админу)

 

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

далее, из записи вычитаю поле "время разрешения" (тип поля - дата/время) и тут главная загвозка.... как мне высчитать, что обращение должно разрешиться через 2 часа (120 минут)?

 

если должно решиться больше 2 часов - пропустить запись

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

ко всему прочему, кажется, что могут возникнут потери записей (из разряда, если на момент проверки, "время разрешения" должно быть через 2 часа и 5 минут, то в следующую проверку может быть уже меньше 2 часов) - это смущает.



из идей:

  1. пробовать преобразовать поле с помощью формул .TotalHours/.TotalMinutes в часы/минуты и сравнивать..
  2. попробовать с помощью формул .AddMinutes(), .AddHours() добавить настройке "текущее время и дата" значение системной настройки и сравнить...

в общем, буду рада советом, а сама пошла пока пробовать :) 

Нравится

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

Aleksei Efimenko, 

я прибегла к другому решению:

  • сделала системную настройку, которая хранит значение за сколько нужно уведомление (в минутах)
  • сделала 2 параметра: 

Параметр 1: [#Системная переменная.Текущее значение времени#]. AddMinutes([число из системной настройки])

Параметр 2: параметр 1. AddMinutes(59) - чтобы получился час

 

  • и развела условными потоками:

1. если время разрешение больше моих параметров или меньше - проскакиваю

2. если время разрешение попадает в промежуток параметров - высылаю уведомление

Создаю новое поле - Reminding time. И его сравниваю.

 

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

Александра Дубс, подскажите, решило ли вашу задачу предоставленное решение от Владимира?

Aleksei Efimenko, 

я прибегла к другому решению:

  • сделала системную настройку, которая хранит значение за сколько нужно уведомление (в минутах)
  • сделала 2 параметра: 

Параметр 1: [#Системная переменная.Текущее значение времени#]. AddMinutes([число из системной настройки])

Параметр 2: параметр 1. AddMinutes(59) - чтобы получился час

 

  • и развела условными потоками:

1. если время разрешение больше моих параметров или меньше - проскакиваю

2. если время разрешение попадает в промежуток параметров - высылаю уведомление

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

Добрый день. При добавлении обращения любым способом такая ошибка. Помогите! Что делать? Поддержка игнорит нас((( The INSERT statement conflicted with the FOREIGN KEY constraint "FKHt8lBgKfy2jprTXzDRFvnS56zg". The conflict occurred in database "bpmpredprod", table "dbo.Case", column 'Id'. The statement has been terminated. ---> System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint "FKHt8lBgKfy2jprTXzDRFvnS56zg". The conflict occurred in database "bpmpredprod", table "dbo.Case", column 'Id'. The statement has been terminated.

Нравится

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

Уверены, что ошибка именно в коробочном функционале?

Скорее всего есть какая-то доработка на именно вашем сайте (напр. процесс), которая пытается добавить записи на деталь обращения, но подставляет неверный Id записи обращения.

Либо же логика пытается добавить записи на деталь ДО сохранения обращения в БД. Все заполнения деталей возможны только после сохранения основной записи в базу данных.

Уверены, что ошибка именно в коробочном функционале?

Скорее всего есть какая-то доработка на именно вашем сайте (напр. процесс), которая пытается добавить записи на деталь обращения, но подставляет неверный Id записи обращения.

Либо же логика пытается добавить записи на деталь ДО сохранения обращения в БД. Все заполнения деталей возможны только после сохранения основной записи в базу данных.

Владислав Литвинчук,

Ошибка возникла после обновления на версию 7.16.

До этого все работало стабильно. Мне кажется при таком раскладе дело не в логике.

Есть еще какие-то варианты?

Спасибо!

Надежда, это ссылка на Case из таблицы CaseLifecycle. Проверьте, нет ли у Вас  каких-то доработок в этом объекте или его страницах, которые могли сломаться при обновлении. Если нет и сломалось обновление системы без доработок, лучше обратиться к поддержке.

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

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

Добрый день, Александр!

Доработки ЖЦ были, переопределили схему в нашем пакете: добавлено поле в объект, и добавлено отслеживание изменений этого поля в объекте Case и его запись в ЖЦ. 

Как можно оперативно исправить ошибку? Спасибо за помощь!

Действительно проблемы были из-за доработок событийных процессов объекта Case. В новой версии 7.16 добавилась колонка CaseRecordId в объекте CaseLifeCycle, которая не обрабатывалась у нас.

Всем спасибо!

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

Добрый день!

Установили дополнение "Calculated metrics for Creatio" https://marketplace.terrasoft.ru/app/calculated-metrics-creatio?activity=marketplace-iframe

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

Замещений модуля BootstrapModulesV2 в системе нет.

Как победить проблему? Кто-то сталкивался?

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

Версия: Service Enterprise 7.16.2

Нравится

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

Павел, добрый день! не получилось воспроизвести ошибку выше на базовом продукте. После установки появляется отдельный пункт Расчетный показатель.

 

Уточните, какие еще решения с функциональностью, расширяющей дашборды, у вас установлены?

Ирина, добрый день!

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

В дебаггере js браузера не могу найти метод getWidgetTypes из схемы ViewModelSchemaDesignerSchema. Пытался понять, идёт ли вызов вообще.

 

define("ViewModelSchemaDesignerSchema", ["DFDashboardDesigner", "WidgetGridLayoutEditItemModel"],
	function() {
		return {
			messages: {},
			attributes: {},
			methods: {
				getWidgetTypes: function() {
					var types = this.callParent(arguments);
					types.CalculatedMetric = {
						"type": "DFCalculationIndicator",
						"caption": this.get("Resources.Strings.NewWidgetCalculatedMetricCaption")
					};
					return types;
				}
			},
			details: {},
			diff: [],
			infoDiff: []
		};
	});

 

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

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

Ирина, добрый день! Компиляцию и генерацию проводил - не помогло. Это первое что я попробовал сделать для решения проблемы. Ошибок в логах приложения после компиляции нет.

Лазоренко Ирина,

При попытке открыть дашборд  'Расчётная аналитика' который идёт в поставке, в разделе Контакты, вижу ошибки в консоли 

Лазоренко Ирина,

При попытке редактировать дашборд  'Расчётная аналитика' который идёт в поставке, в разделе Контакты, вижу ошибки в консоли

Павел, добрый день!

 

установите повторно приложение и пришлите лог установки приложения. После установки проверьте, что в Конфигурации появился пакет CalculationIndicator.gz.

 

Также проверьте консоль и пришлите ошибку, если таковая будет, при открытии списка выбора типа нового итога.

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

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

Нравится

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

 

Марат Тазюков, добрый день!

В целом, настройка РФС на .Net Core выполняется так же, как и для .Net Framework, но изменения ключей fileDesignMode и UseStaticFileContent выполняются в файле Terrasoft.WebHost.dll.config:

Собственно вопрос как подключить хранилище SVN? Версия service ent 7.17.1.1364 (.NET Core 3.1.11)

Тут непонятно это проблема net core или вы что-то забыли сделать, пишите хотя бы порядок действий перед вопросом.

Стандартные действия: добавить хранилище в список хранилищ, sql запросом поставить у пакета installtype = 0 и sysrepositoryid = select top 1 [id] from [sysrepository].

Это чистая установка, дополнительно ничего не настраивал просто развернул по инструкции.

Я не могу добавить хранилище в список тк пункт меню не активный и внешний вид отличается не как описано в документации. Куда в этом интерфейсе зайти чтоб прописать хранилище SVN? Судя но названиям мне надо было попасть в список хранилищ но этот пункт меню не активный. 

Бабков Алексей Валерьевич,

Добавте запись напрямую в бд в sysrepository.

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

А данная проблема может быть связанна с тем что система установлена на centoc?

 

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

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

В качестве обходного решения можно использовать РФС + к примеру Git.

Sorotiuk Anna, подскажите, пожалуйста как перейти в режим разработки в файловой системе? Вот web.config и в нем нет ключей описанных в академии.

.<?xml version="1.0" encoding="utf-8"?>

<configuration>

  <location path="." inheritInChildApplications="false">

    <system.webServer>

      <handlers>

        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />

      </handlers>

      <aspNetCore processPath="dotnet" arguments=".\Terrasoft.WebHost.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />

    </system.webServer>

  </location>

</configuration>

 

Марат Тазюков, добрый день!

В целом, настройка РФС на .Net Core выполняется так же, как и для .Net Framework, но изменения ключей fileDesignMode и UseStaticFileContent выполняются в файле Terrasoft.WebHost.dll.config:

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

Добрый день!

Помогите разобраться.

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

В итоге уведомления уходят с основного ящика контакту обращения и системному почтовому ящику 2.

Поддержка ничего не может ответить внятного :(

В поле "кому" указываю емаил контакта в бизнес процессе, отправитель = системная настройка. Отправку делаю так:

var activityId = Get<Guid>("activityId");//AddActivityDataUserTask.RecordId;
var emailClientFactory = ClassFactory.Get<EmailClientFactory>(new ConstructorArgument("userConnection", UserConnection));
var activityEmailSender = new ActivityEmailSender(emailClientFactory, UserConnection);
activityEmailSender.Send(activityId);
return true;

 

Нравится

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

Добрый день.

В каком состоянии у вас настройка "AutoNotifyOnlyContact"? попробуйте поставить в True, после перезапустить приложение, и почистить редис. т.к. настройка кэшируется.

Добрый день.

В каком состоянии у вас настройка "AutoNotifyOnlyContact"? попробуйте поставить в True, после перезапустить приложение, и почистить редис. т.к. настройка кэшируется.

спасибо большое! судя по статье на академии должно помочь. попробую и напишу по результату.

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

В разделе есть несколько типов страницы редактирования. Как установить условия на видимость кнопки добавления для одного из типов? В каком модуле определены данные кнопки? Заранее спасибо!

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

Нравится

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

В diff схемы реестра раздела добавляем 

{

            "operation": "merge",

            "name": "SeparateModeAddRecordButton",

            "parentName": "SeparateModeActionButtonsLeftContainer",

            "propertyName": "items",

            "values": {

                "itemType": Terrasoft.ViewItemType.BUTTON,

                "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                "caption": {"bindTo": "AddRecordButtonCaption"},

                "click": false,

                "visible": {"bindTo": "IsAddRecordButtonVisible"},

                "classes": {

                    "textClass": ["actions-button-margin-right"],

                    "wrapperClass": ["actions-button-margin-right"]

                },

                "controlConfig": {

                    "menu": {

                        "items": {

                            "bindTo": "EditPages",

                            "bindConfig": {

                                "converter": function(editPages) {

                                    if (editPages.getCount() === 0) {

                                        return null;

                                    }

                                    var operationHash = {

                                        "38d26ca1-ab6a-474c-950d-f9ac9b630967": "CanAbilityToAdd1", //здесь guid это id справочника по которому определяется страница редактирования

                                        "2495b17d-2465-41cb-b625-ac36d9aef931": "CanAbilityToAdd2"

                                    };

                                    

                                    var allowedPages = [];

                                    

                                    if (this.get("CanAbilityToAdd1")) {

                                        allowedPages.push("CanAbilityToAdd1");

                                    }

                                    

                                    if (this.get("CanAbilityToAdd2")) {

                                        allowedPages.push("CanAbilityToAdd2");

                                    }

                                    for (var key in operationHash) {

                                        var hashItem = departmentToOperationHash[key];

                                        if (allowedPages.indexOf(hashItem) === -1) {

                                            editPages.collection.remove(editPages.collection.getByKey(key));

                                        }

                                    }

                                    return editPages;

                                }

                            }

                        }

                    }

                }

            }

        }

}

 

В init добавляем к примеру проверку на доступ по операции, либо другую функциональность

initCanAbilityToAdd1: function() {

                RightUtilities.checkCanExecuteOperation({

                    operation: "CanAbilityToAdd1"

                }, function(result) {

                    this.set("CanAbilityToAdd1", result);

                }, this);

            },

Добрый вечер.

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

Названия пунктов меню для разных страниц редактирования берутся из поля ActionKindCaption.

Более подробную информацию посмотрите в этом посте.

Пользовательскими настройками (без внесения дополнительных изменений в программный код) настроить видимость пункта меню в кнопке [Добавить] этого сделать не получится.

Базовая логика добавления пунктов меню для кнопки [Добавить] раздела реализована в схеме 'BaseDataView' пакета NUI.

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

Надежда, ещё есть радикальный пользовательский способ: включить администрирование по записям для объекта справочника типов этого раздела и убрать у ненужного типа права на чтение для всех (кроме администраторов). Так нельзя будет выбрать этот тип при создании записи в разделе. Но нужно убедиться, корректно ли в этом случае будут видимы существующие записи с этим типом в разделе.

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

Не уверенна, что разграничение прав доступа, как-то повлияет на видимость пункта меню кнопки [Добавить] для этого типа.

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

В diff схемы реестра раздела добавляем 

{

            "operation": "merge",

            "name": "SeparateModeAddRecordButton",

            "parentName": "SeparateModeActionButtonsLeftContainer",

            "propertyName": "items",

            "values": {

                "itemType": Terrasoft.ViewItemType.BUTTON,

                "style": Terrasoft.controls.ButtonEnums.style.GREEN,

                "caption": {"bindTo": "AddRecordButtonCaption"},

                "click": false,

                "visible": {"bindTo": "IsAddRecordButtonVisible"},

                "classes": {

                    "textClass": ["actions-button-margin-right"],

                    "wrapperClass": ["actions-button-margin-right"]

                },

                "controlConfig": {

                    "menu": {

                        "items": {

                            "bindTo": "EditPages",

                            "bindConfig": {

                                "converter": function(editPages) {

                                    if (editPages.getCount() === 0) {

                                        return null;

                                    }

                                    var operationHash = {

                                        "38d26ca1-ab6a-474c-950d-f9ac9b630967": "CanAbilityToAdd1", //здесь guid это id справочника по которому определяется страница редактирования

                                        "2495b17d-2465-41cb-b625-ac36d9aef931": "CanAbilityToAdd2"

                                    };

                                    

                                    var allowedPages = [];

                                    

                                    if (this.get("CanAbilityToAdd1")) {

                                        allowedPages.push("CanAbilityToAdd1");

                                    }

                                    

                                    if (this.get("CanAbilityToAdd2")) {

                                        allowedPages.push("CanAbilityToAdd2");

                                    }

                                    for (var key in operationHash) {

                                        var hashItem = departmentToOperationHash[key];

                                        if (allowedPages.indexOf(hashItem) === -1) {

                                            editPages.collection.remove(editPages.collection.getByKey(key));

                                        }

                                    }

                                    return editPages;

                                }

                            }

                        }

                    }

                }

            }

        }

}

 

В init добавляем к примеру проверку на доступ по операции, либо другую функциональность

initCanAbilityToAdd1: function() {

                RightUtilities.checkCanExecuteOperation({

                    operation: "CanAbilityToAdd1"

                }, function(result) {

                    this.set("CanAbilityToAdd1", result);

                }, this);

            },

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

 

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

Полозюков Евгений Петрович,

 пытаюсь сделать что-то подобное, все проверила 10 раз, но отладчик выдает:

Uncaught (in promise) TypeError: RightUtilities.checkCanExecuteOperation is not a function

А Вы добавили в начале в квадратных скобках и параметрах ссылку на RightUtilities? Посмотреть, как это сделано, можно в других схемах, где её используют:

define("SysOperationAuditSectionV2", ["BaseFiltersGenerateModule", "SysOperationAudit", "SysOperationAuditArch",
	"RightUtilities"],
function(BaseFiltersGenerateModule, SysOperationAudit, SysOperationAuditArch, RightUtilities) {
	return {

 

Зверев Александр, да, была проблема с последовательностью схем и параметров, передаваемых в схему)

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

 

Спасибо, что подсказали на тему замещения BaseDataView. Натолкнули на верный путь!

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

define("ActivitySectionV2", ["ConfigurationConstants","RightUtilities","ProcessModuleUtilities","BaseDataView"],
function(ConfigurationConstants,RightUtilities,ProcessModuleUtilities) {
	return {
		entitySchemaName: "Activity",
		details: /**SCHEMA_DETAILS*/{}/**SCHEMA_DETAILS*/,
		attributes: 
		{ 
			"UsrCanManageItTask": {
				dataValueType: this.Terrasoft.DataValueType.BOOLEAN,
				type: this.Terrasoft.ViewModelColumnType.VIRTUAL_COLUMN,
				value: false
			}
		},
		diff: /**SCHEMA_DIFF*/[
 
			]/**SCHEMA_DIFF*/,
		methods: {
			init: function()
			{
					this.getUserSettingsOperationRight();
					window.console.log("Инициализация");
					this.callParent(arguments);
					window.console.log("Права");
 
			},
 
			initEditPages: function() {
				window.console.log("Определение кнопок начало");
 
				var enabledEditPages = new this.Terrasoft.Collection();
 
					this.callParent(arguments);
					var editPages = this.get("EditPages");
 
					window.console.log("Получение страниц");
					var flag = this.get("UsrCanManageItTask");
					this.Terrasoft.each(editPages.getItems(), function(item) {
						window.console.log("Проверка типа");
						window.console.log(item.get("Id"));
						//window.console.log(ConfigurationConstants.Activity.Type.Email);ConfigurationConstants.Activity.Type.Call
						if (item.get("Id") !== "e2831dec-cfc0-df11-b00f-001d60e938c6" &amp;&amp;
							item.get("Id") !== "e1831dec-cfc0-df11-b00f-001d60e938c6") {
 
							if (item.get("Id") !== "f5921924-3e81-4a5f-ae4c-5a6f1b6e7661")
							{
								enabledEditPages.add(item);
								//window.console.log("ок");
							}
							else { 
								if (flag)
								{
										enabledEditPages.add(item);
										//window.console.log("ок");
								}
							}
						}
					});
					window.console.log("Проверка типа конец");
					this.set("EnabledEditPages", enabledEditPages);
 
					window.console.log("Определение кнопок конец");
			},
 
			getFilters: function() {
						window.console.log("Добавление фильтра");
						var filters = this.callParent(arguments);
						if (!this.get("UsrCanManageItTask"))
						{
							filters.add("NotItTask", this.Terrasoft.createColumnFilterWithParameter(
							this.Terrasoft.ComparisonType.NOT_EQUAL, "Type", "f5921924-3e81-4a5f-ae4c-5a6f1b6e7661"
							));
							window.console.log("Добавление фильтра");
						}
						return filters;
			},
 
			getUserSettingsOperationRight: function() {
				//debugger;
				var operationsToRequest = ["UsrCanManageItTask"];
				//operationsToRequest.push("UsrCanManageItTask");
				window.console.log("Права");
 
				RightUtilities.checkCanExecuteOperations(operationsToRequest, function(result) {
					if (result) {
						this.set("UsrCanManageItTask", result.UsrCanManageItTask);
						window.console.log("Права на ит-задачи: "+result.UsrCanManageItTask);
					}
				}, this);
			}
		}
 
	};
});

 

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

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

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

Для бандла 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() &amp;&amp; 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 &amp;&amp; response.ResponseStatus.Message;
	if (response.success &amp;&amp; !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)
		});
	}
},

 

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

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

Пытаюсь установить расширение ITSM https://marketplace.terrasoft.ru/app/itsm-service-creatio для Service Enterprise.

При установке пишет, что Зависимый пакет "ServiceEnterpriseSoftkey" не найден

У нас Sales Enterprise On-Site, но вчера получили лицензии Service Ent.

Где взять этот пакет для скачивания, чтобы ITSM заработал? Поддержка отправляет сюда.

Нравится

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

Судя по всему, вы лицензии Service получили, но само приложение у вас осталось только с пакетами Sales. Вам лучше связаться с вашим менеджером в ТС, чтобы он сделал запрос в тех поддержку на добавление пакетов Service в ваш сайт.

Судя по всему, вы лицензии Service получили, но само приложение у вас осталось только с пакетами Sales. Вам лучше связаться с вашим менеджером в ТС, чтобы он сделал запрос в тех поддержку на добавление пакетов Service в ваш сайт.

Александр, спасибо за подсказку.

Связался с менеджером в Creatio, они не могут понять что мне нужно, лицензии у нас есть, всё должно быть нормально. Написал в тех поддержку, они не берутся поддерживать devlabs, отправляют сюда, в Community.

Подскажите пожалуйста, что мне конкретно спрашивать у Менеджера или у тех поддержки? Они не понимают.

Пакет для установки Service Enterprise? Какой-то модуль? Или как им объяснить?

У нас On-site, версия 7.13

Сначала убедитесь, что у Вас вообще функциональность Service Enterprise есть. Появились ли новые рабочее место и разделы?

Если нет, то нужно обновить сайт до бандла, а уже потом пробовать устанавливать дополнения.

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

Каким образом использовать функционал сервисных инженеров по сервису? 

В курсах указано:

1) Создать сервис и указать сервисных инженеров по уровню поддержки

2) В обращении указать сервис и уровень поддержки (по умолчанию указан 1 уровень), после чего в полях группа ответственных и ответственный должны быть доступны выбранные группы/ответственные. Но такого не происходит. Доступны все группы и все пользователи.

Нравится

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

Константин Марков,

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

А стрелка вниз в этом поле ещё работает? Кажется, ею можно было вызвать отфильтрованный список

 

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

Константин Марков,

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

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

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

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

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

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

Нравится

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

Добрый день.

Если хотите сравнивать значения до и после, то есть 2 варианта.

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

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

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

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

Добрый день.

Если хотите сравнивать значения до и после, то есть 2 варианта.

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

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

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

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

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