Подписаться на сообщение загрузки модуля из схемы EmailMessagePublisherPage

messages: {
			"SendListenerEmailData": {
				mode: this.Terrasoft.MessageMode.PTP,
				direction: this.Terrasoft.MessageDirectionType.PUBLISH
			},
			"EmailMessagePageLoaded": {
				mode: this.Terrasoft.MessageMode.PTP,
				direction: this.Terrasoft.MessageDirectionType.SUBSCRIBE
			},
		},
		methods: {
			init: function(){
				this.callParent(arguments);
				this.sandbox.subscribe("EmailMessagePageLoaded", this.onEmailMessagePageLoaded, this, [this.getEmailMessagePublisherModuleId()]);
			},
 
			onEmailMessagePageLoaded: function(args){
				debugger;
				if (this.$EntitySchemaName === "NrbCase") {
					Terrasoft.chain(
						function (next) {
							var esq = Ext.create("Terrasoft.EntitySchemaQuery", { rootSchemaName: "NrbConfigurator", rowCount: 1 });
							esq.addColumn("NrbMailboxForComunicationWithClient");
							esq.getEntityCollection(function (result) {
								if (!result.success || result.collection.count == 0) {
									throw new Error("Запись конфигуратора не найдена");
								}
								var getMailFromConfigurator = result.collection.first();
								var senderEmailConfigurator = getMailFromConfigurator.values.NrbMailboxForComunicationWithClient;
								next(senderEmailConfigurator);
							}, this);
						},
						function (next, senderEmailConfigurator) {
							data = {
								entitySchemaName: this.$EntitySchemaName,
								title: this.getMasterEntityParameterValue("Number"),
								recepientEmail: this.getMasterEntityParameterValue("NrbContactEmail"),
								contact: this.getMasterEntityParameterValue("Contact"),
								nrbObject: this.getMasterEntityParameterValue("NrbServiceObject"),
								senderEmail: senderEmailConfigurator
							}
							this.sandbox.publish("SendListenerEmailData", data, [this.getEmailMessagePublisherModuleId()]);
						}, this
					);
				}
			},

И опубликовать сообщение SendListenerEmailData

Переопределить схему EmailMessagePublisherPage

define("EmailMessagePublisherPage", ["EmailMessagePublisherPageResources"],
		function(resources) {
			return {
				entitySchemaName: "Activity",
				mixins: {
				},
				messages: {},
				attributes: {},
				methods: {
                  	setListenerEmailData: function(data) {
                      	this.callParent(arguments);
                      	debugger;
                        if(data.entitySchemaName == "NrbCase"){
							this.$Title = data.title;
                          	this.$Recepient = data.recepientEmail;
                          	this.$NrbObject = data.nrbObject.value || {};
                          	this.$Sender = data.senderEmail;
                          	this.$Contact = data.contact;
 
                        }
					},
                },
				diff: /**SCHEMA_DIFF*/[]/**SCHEMA_DIFF*/
			};
		});

 

Нравится

Поделиться

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

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

Как массово сменить таким документам кейсы, чтобы статус документа не изменился? В самом кейсе нет никаких действий (всё выполняется в БП) - настроены только переходы между статусами и сам набор статусов

Нравится

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

Добрый день!

С помощью базовых функций в интерфейсе массовое автоматическое изменения кейсов с сохранением текущего статуса невозможно. Вполне вероятно, что это можно реализовать с помощью средств разработки. Обратите внимание на пост с похожей проблемой: https://community.terrasoft.ru/questions/zapustit-obnovlennyy-keys

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

Ярослав Савицкий,

спасибо за разъяснения. Было бы здорово сделать системную настройку "Автоматически заменять кейс при отсутствии запущенных процессов или действий"

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

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

Имеется задача: Показать диалоговое окно подтверждения с кнопками OK и KO для подтверждения отмены Обращения (Case), если пользователь нажал на статус Cancel в DCM.
Если была нажата кнопка OK, то Case отменяется.
Если была нажата кнопка KO, то Case вернется к предыдущему статусу.

Я попытался отобразить диалоговое окно по событию OnSaving объекта Case.
Вот моя функция:

public override void OnSaving(object sender, EntityBeforeEventArgs e) {  
string status = UpdateData(sender);
if(status!="Canceled") {
base.OnSaving(sender, e);
  	} else {
    		//Todo: Show dialog with question
  		//Todo: Get response OK or KO
                /*if(response ="OK"){
                        base.OnSaving(sender, e);
                 }else{
                        e.IsCanceled = true;
        }*/
}
}

К сожалению, я не нашла никакой информации о том, как отобразить диалоговое окно на стороне сервера.
Я знаю способ отправки сообщений с клиентской стороны (this.showConfirmationDialog(message, function(returnCode)), но не знаю, как вернуть результат нажатия кнопки на сервер для завершения метода OnSaving.

private void SendMessage(object sender) {
       var entity = (Entity)sender; 
       var userConnection = entity.UserConnection;
      string senderName = "MySenderNameCase";  
      string message = JsonConvert.SerializeObject(new {test = "status"});
      MsgChannelUtilities.PostMessage(userConnection, senderName, message);
  }             

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

Нравится

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

Мы делали подтверждение перехода Case на финальный статус на странице, выдавая showConfirmationDialog в функции Save.

 

this.showConfirmationDialog(confirmationMessage.message, function(result) {
    if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
        this.save(scopeArguments);
     } else {
        this.onDiscardChangesClick();
    }
}, ["Yes", "No"]);

 

Мы делали подтверждение перехода Case на финальный статус на странице, выдавая showConfirmationDialog в функции Save.

 

this.showConfirmationDialog(confirmationMessage.message, function(result) {
    if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
        this.save(scopeArguments);
     } else {
        this.onDiscardChangesClick();
    }
}, ["Yes", "No"]);

 

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

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

 

Это помогло решить задачу!

 

Mariia Prostiak,

 как все же у Вас получилось положить всплывающий вопрос в Save?

this.save(scopeArguments); - и что ложили в "scopeArguments". Если не сложно, можете написать код функции, есть такая же задача на решении?

Владимир Соколов,

 или подскажите Вы, как в Save реализовали данное всплавающее соощение не получив рекурсии

Александр Тыра,

 

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

Вечная рекурсия решается вызовом this.callParent(config) вместо this.save(scopeArguments);

Итого получается:

save: function(config) {
this.showConfirmationDialog(confirmationMessage.message, function(result) {
    if (result === Terrasoft.MessageBoxButtons.YES.returnCode) {
        this.callParent(config);
     } else {
        this.onDiscardChangesClick();
    }
}, ["Yes", "No"]);
 
}

 

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

1. Изменяем пакет в дизайнере кейса.
2. Сохраняем
3. Выходим / заходим в схему кейса
В кейсе указан старый пакет.
Как перенести кейс между пакетами?

Нравится

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

Мне кажется, что это баг 7.15.X - мы тоже с таким столкнулись, но решения пока не нашли.

 

Здравствуйте, Игорь!

 

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

 

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

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

Всем доброго дня.

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

При переходе по статусам в старых записях на экран выдаётся сообщение об ошибке: "Процесс с идентификатором "<здесь разные guid'ы>" не найден".

Подскажите, пожалуйста, как можно эту ошибку исправить? Может очистить какую-либо таблицу?

Нравится

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

Уже обсуждалось тут

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

Смотрел в своё время ту тему. В журнале процессов пусто. Из кейса ничего не стартует - только ошибку выдаёт.

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

Искал этот идентификатор через базу. Нашёл его в нескольких служебных таблицах, но раскрутить связи пока не получилось.

Фёдоров Александр Сергеевич,

Напишите где нашли возможно поможем. Как вариант вы можете раскрыть записи библиотеки процессов и журнала процессов и в url подставить ваши id, возможно ваш процесс или его єкземпляр найдется

Было аналогичное при смене стадии в разделе «Сделки». Тоже  изменялись процессы, которые привязаны к состоянию сделки (настройка кейсов) — добавили новые процессы, убрали и изменили несколько процессов.

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

По информации от разработчиков продукта, если элемент завершается с ошибкой из-за дедлока,  то может быть выполнен автоматический откат транзакции, поэтому и нет записей в таблице SysProcessElementData (дедлок был при попытке записи в таблицу). Такое поведение связано с ошибкой в движке процессов, которое исправлено в версии 7.11.

У Вас и так 7.11, попробуйте обновиться до последней 7.11.3 или ещё дальше.

Мотков Илья,

Очень похоже на описанное... Сейчас на 7.11.3. Будем планировать обновляться...

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

Нужно решить следующую задачу:
1. Создать новое рабочее место и раздел в нем.
2. На странице раздела должен выводиться список кастомных объектов, каждый из которых имеет id (внешний, не тот который в базе bpmonline), название и ссылку (должна быть кликабельна). Объекты должны подгружаться со стороннего API.

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

Я решил попытаться сделать деталь с пользовательскими полями по туториалу (https://academy.terrasoft.ru/documents/technic-sdk/7-10/sozdanie-polzova...) версия системы у меня 7.10б однако, следуя примеру, родительским объектом детали следовало указать Base fields detail из пакета BaseFinance, но у меня он не установлен, и не понятно, установить его, или же не стоит тащить целый пакет ради одного объекта. Пытался по-другому создать делаь и вывести список на страницу раздела, но ничего так и не получилося.

После создания детали и добавления списка на страницу раздела, планировал при загрузке страницы посылать AJAX-запрос по API, потом с помощью службы DataService вытащить существующие объекты, сравнить с получены ответом, и с помощью этой же службы удалить неактуальные и добавить новые, и таким образом обойтись без конфигурационных сервисов, так как совсем не знаком с языком С#.

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

Нравится

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

Я думаю вам правильнее будет сделать самый обыкновенный раздел мастером разделов на основании объекта, с текстовой колонкой для ссылки, и с текстовой колонкой для внешнего id (если он guid), или числовой, если число.
Сделать несколько доработок что бы ссылка была кликабельной и вела во внешнюю систему.

А наполнять данный раздел с помощью интеграции. И тут открывается множество вариантов. Будь то запрос во внешнюю систему, с переодичностью. Либо внешняя система будет сохранять данные в bpm посредством odata каждый раз как таковые будут там созданы. Либо написать веб сервис в bpm и вызывать его из внешней системы. С вариантами интеграции можете ознакомится здесь:
https://academy.terrasoft.ru/documents/technic-sdk/7-10/integraciya-s-s…

"Максим Шевченко" написал:

Я думаю вам правильнее будет сделать самый обыкновенный раздел мастером разделов на основании объекта, с текстовой колонкой для ссылки, и с текстовой колонкой для внешнего id (если он guid), или числовой, если число.
Сделать несколько доработок что бы ссылка была кликабельной и вела во внешнюю систему.

А наполнять данный раздел с помощью интеграции. И тут открывается множество вариантов. Будь то запрос во внешнюю систему, с переодичностью. Либо внешняя система будет сохранять данные в bpm посредством odata каждый раз как таковые будут там созданы. Либо написать веб сервис в bpm и вызывать его из внешней системы. С вариантами интеграции можете ознакомится здесь:
https://academy.terrasoft.ru/documents/technic-sdk/7-10/integraciya-s-si...


Спасибо, буду смотреть и пробовать.

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

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

у Лида есть кейс, в котором на стадии распределения появляется задача "Распределите лид, определите стратегию взращивания лида", при нажатии на которую запускается БП Распределение лида.
Как можно реализовать аналогичное? Где можно посмотреть как это реализовано?

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

BPM'Online 7.10.0.1742

Нравится

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

Любовь, здравствуйте!

Описанная логика реализована в процессе "Распределение лида 7.8.0". Процесс запускается вручную. Можно сделать копию процесса, в которой элемент "Страница распределения" заменить элементом "Задача".
Предварительно в справочник "Результаты активностей" необходимо добавить три возможных результата:

  1. Интерес отсутствует
  2. Перевод в продажу
  3. Распределить позднее

Каждой записи необходимо добавить признак "Использовать только в процессе".

Далее в копии процесса необходимо удалить элемент "Преднастроенная страница" (предварительно очистив связи) и заменить его элементом задача. В исходящих условных потоках выберите результаты, в зависимости от которых, процесс пойдет по одной из веток.

Из DCM процесс можно будет вызвать как подпроцесс.

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

"Демьяник Алексей" написал:

Любовь, здравствуйте!

Описанная логика реализована в процессе "Распределение лида 7.8.0". Процесс запускается вручную. Можно сделать копию процесса, в которой элемент "Страница распределения" заменить элементом "Задача".
Предварительно в справочник "Результаты активностей" необходимо добавить три возможных результата:

  1. Интерес отсутствует
  2. Перевод в продажу
  3. Распределить позднее

Каждой записи необходимо добавить признак "Использовать только в процессе".

Далее в копии процесса необходимо удалить элемент "Преднастроенная страница" (предварительно очистив связи) и заменить его элементом задача. В исходящих условных потоках выберите результаты, в зависимости от которых, процесс пойдет по одной из веток.

Из DCM процесс можно будет вызвать как подпроцесс.

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


Алексей, спасибо за подробный алгоритм.

Поясню, что я имела в виду.
процесс "распредение лида" был приведен в качестве примера.
вообще у нас реализован свой процесс над другой сущностью . В рамках нашего процесса есть шаги, на которых пользователь должен заполнять некоторые поля. Допустим,на одном шаге 5 полей, на другом 3 и т.д. Поэтому не хочется открывать страницу редактирования полностью, а хочется открыть свою преднастроенную страничку, где только эти 5 (или 3) полей, чтоб пользователь четко видел то, что он должен заполнить и чтобы не отвлекать его остальной информацией.
но проблема в том, что преднастроенные страницы в виде задачи не отображаются в активностях, а нам нужно сделать так, чтобы как -то они отображались.
и вот я увидела кейс лида, в рамках которого есть задача "Распределите лид, определите стратегию взращивания лида", и по клику на нее открывается преднастроенная страница(судя по всему просто запускается процесс Распределения). Мне показалось, что таким образом можно решить мою проблему(отображать преднастроенную страницу в активности).
поэтому хотела узнать
1) где именно прописывается тот факт, что клик по задаче "Распределите лид, определите стратегию взращивания лида" запускает процесс распределения
2) можно ли как-то вывести преднастроенные/автогенерируемые страницы в активности (или только как вы описали через результаты активностей, но мне этот вариант не подходит, так как нужно заполнять не одно, а несколько полей и набор полей будет разным на разных шагах)

Добрый день, Любовь!

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

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

Это самый оптимальный вариант, пока ожидаем реализации в платформе.
При этом он довольно просто реализуется.
Описывайте поэтапную логику в JavaScript со скрытием/демонстрацией полей.

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