Добрый день!

Подскажите, пожалуйста, может у кого-то был подобный кейс. Можно ли реализовать визирование объекта непосредственно из e-mail уведомления? При настройке уведомления к элементу визирования, такой возможности не вижу. Предполагаю, что можно в самом шаблоне использовать элемент [кнопка], чтобы там разместить ссылки, содержащие параметры согласовать/отклонить? Но как инициализировать объект  (передать в ссылку GUID объекта), который надо визировать? 

Буду признательна за любой совет!!!

Нравится

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

Добрый день.



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

Подробнее на сайте академии:

https://academy.terrasoft.ua/docs/developer/komponenty_prilozheniya/ema…



https://academy.terrasoft.ua/docs/developer/komponenty_prilozheniya/ema…



Похожее обращения на комьюнити:

https://community.terrasoft.ua/questions/vizirovanie-cherez-email



https://community.terrasoft.ua/questions/vizirovanie-s-pomoschyu-email

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

Есть замещённая страница VisaNotificationsSchema. В ней нужно получить данные об объекте, который указан в нотификации(например Case). Пока моя идея в том, чтобы как-то получить id этого объекта, а потом через ESQ достать все нужные мне данные об этом объекте.



Вопрос в том, как получить этот id ?

this.get("Id")

даёт именно Id визы, а не объекта, на который идёт ссылка.



Видел ещё в VisaNotificationsSchema функцию getVisaEntity: function(callback), но как из неё достать Id тоже не разобрался.

Нравится

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

Добрый день, 

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

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

Нравится

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

Это возможно, для реализации можно создать замещающую схему VisaNotificationsSchema со следующим содержимым:

 

define("VisaNotificationsSchema", function() {
   return {
      methods: {

         getVisaActionButtonMenu: function() {
            const menu = this.get("VisaActionButtonMenu");
            if (menu.getCount() > 3) {
               menu.removeByIndex(1);
               menu.removeByIndex(1);
               menu.removeByIndex(1);
            }
            return menu;
         }
      },
      diff: [
         {
            "operation": "merge",
            "name": "VisaActionButton",
            "parentName": "NotificationItemTopContainer",
            "propertyName": "items",
            "values": {
               "itemType": Terrasoft.ViewItemType.BUTTON,
               "style": Terrasoft.controls.ButtonEnums.style.TRANSPARENT,
               "classes": {"wrapperClass": ["visaActionButtonWrap-class"]},
               "caption": {"bindTo": "Resources.Strings.VisaActionButton"},
               "prepareMenu": {"bindTo": "selectNotificationItemOnActionButtonClick"},
               "menu": {
                  "items": {"bindTo": "getVisaActionButtonMenu"}
               }
            }
         }
      ]
   };
});

Олег Нефедьев,

 

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

Олег Нефедьев,

 

Спасибо, все работает. Подскажите, пожалуйста, возможно еще добавить ограничение, чтобы кнопки были спрятаны только для конкретного раздела (например, cases) , потому сейчас код применился для всех разделов.

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

Добрый день,

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

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

Нравится

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

Подскажите, каким образом реализовано визирование в бизнес-процессе, с помощью элемента "Визирование", или с помощью добавления новой записи объекта визы?

 

Есть ли при открытии коммуникационной панели какие-либо ошибки в консоли браузера (F12)?

Олег Нефедьев,

Визирование реализовано с помощью элемента "Визирование". В консоли какие-то ошибки есть.

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

Добрый день !)

В системе существует роль "Эксперты" внутри этой роли 15-20 пользователей .

 

Если отправить на визу в эту Роль то - по документации любой из этих пользователей может утвердить или отклонить эту визу. 

  • [ Роли ] — выберите из справочника определенную организационную или функциональную роль. Так любой из сотрудников, входящих в эту роль, сможет выполнить визирование.

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

Суть:

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

 

Сделать 20 отдельных виз со всеми исходами пока что кажется нецелесообразным .

Считываю коллекцию "ID всех контактов у которых должность "Эксперт""

После, нужно отправить на визирование всем этим контактам .(Естественно коллекцию нельзя вставлять как параметр процесса в "Кому отправить на визирование")

Поделитесь пожалуйста опытом.

Как использовать считанную коллекцию записей для элемента Визирование ?

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

 

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

 

 

Нравится

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

Tigran Gevorgyan, здравствуйте!

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

В таком случае по каждой записи в коллекции уйдет своя виза.

Подробнее о работе с коллекциями и подпроцессами тут:

https://academy.terrasoft.ru/docs/7-17/user/biznes_processy/nastrojka_p…

 

Tigran Gevorgyan, здравствуйте!

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

В таком случае по каждой записи в коллекции уйдет своя виза.

Подробнее о работе с коллекциями и подпроцессами тут:

https://academy.terrasoft.ru/docs/7-17/user/biznes_processy/nastrojka_p…

 

Sorotiuk Anna,

А как в таком случае прекратить выполнение остальных визирований, если хотя бы одна из виз будет отрицательной?

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

В рамках одного процесса никак.

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

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

Добрый день !)

В системе существует роль "РПМ" внутри этой роли 15-20 пользователей .

 

Если отправить на визу в эту Роль то - по документации любой из этих пользователей может утвердить или отклонить эту визу. 

  • [ Роли ] — выберите из справочника определенную организационную или функциональную роль. Так любой из сотрудников, входящих в эту роль, сможет выполнить визирование.

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

Суть:

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

 

Сделать 20 отдельных виз со всеми исходами пока что кажется нецелесообразным . Поделитесь пожалуйста с опытом )))

Нравится

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

Думаю, вы вполне можете добавлять визирование через элемент БП "Добавить данные", а отслеживать окончание визирование через старт БП на изменение статуса визы. Таким образом, далее уже в БП добавляете свою логику

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

Добрый день!

После добавления визирования в стандартный раздел Продаж (Opportunity), перестали приходить уведомления в Центр уведомлений коммуникационной панели. Уведомления были добавлены отметкой чек-бокса "Enable approval in section" в секции "Approval" мастера разделов. Уведомления перестали приходить в том числе и для разделов Order, Invoice, по которым они ранее приходили. Индикатор визирования в коммуникационной панели отображается,  но текст уведомления в коммуникационной панели отсутствует. Добавление схемы "OpportunityVisaNotificationProvider", записи "Terrasoft.Configuration.OpportunityVisaNotificationProvider" в таблицу "NotificationProvider" не помогло.



В консоли браузера выводится ошибка :

POST https://salesbpm.elcoin.co.uk/0/rest/VisaDataService/GetVisaEntities
[HTTP/2 400 Bad Request 84ms]
Error while sending request response status:
    400 (Bad Request)
    request url: https://salesbpm.elcoin.co.uk/0/rest/VisaDataService/GetVisaEntities
    method: POST
    request data: {"sysAdminUnitId":"3190ebaf-a3cf-461d-95f6-29115215bd39","requestOptions":{"isPageable":true,"rowCount":15}} 
The server encountered an error processing the request. The exception message is '42601: each UNION query must have the same number of columns'. See server logs for more details. The exception stack trace is:
 
at Npgsql.NpgsqlConnector.<DoReadMessage>d__157.MoveNext() 
--- End of stack trace from previous location where exception was thrown 
--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlConnector.<ReadMessage>d__156.MoveNext() 
--- End of stack trace from previous location where exception was thrown 
--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at Npgsql.NpgsqlConnector.<ReadMessage>d__156.MoveNext() --- End of stack trace from previous location where exception was thrown 
--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlConnector.<ReadExpecting>d__163`1.MoveNext() 
--- End of stack trace from previous location where exception was thrown 
--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlDataReader.<NextResult>d__32.MoveNext() 
--- End of stack trace from previous location where exception was thrown 
--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlDataReader.NextResult() at Npgsql.NpgsqlCommand.<Execute>d__71.MoveNext() --- End of stack trace from previous location where exception was thrown 
--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlCommand.<ExecuteDbDataReader>d__92.MoveNext() 
--- End of stack trace from previous location where exception was thrown 
--- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Npgsql.NpgsqlCommand.ExecuteDbDataReader(CommandBehavior behavior) at Polly.Policy.<>c__DisplayClass119_0`1.<Execute>b__0(Context ctx, CancellationToken ct) at Polly.Policy.<>c__DisplayClass129_0`1.<ExecuteInternal>b__0(Context ctx, CancellationToken ct) at Polly.Policy.<>c__DisplayClass103_0.<NoOp>b__1(Context ctx, CancellationToken ct) 
at Polly.NoOp.NoOpEngine.Implementation[TResult](Func`3 action, Context context, CancellationToken cancellationToken) at Polly.Policy.<>c.<NoOp>b__103_0(Action`2 action, Context context, CancellationToken cancellationToken) at Polly.Policy.ExecuteInternal[TResult](Func`3 action, Context context, CancellationToken cancellationToken) at Polly.Policy.Execute[TResult](Func`3 action, Context context, CancellationToken cancellationToken) at Polly.Policy.Execute[TResult](Func`1 action) at Terrasoft.Core.DB.DBExecutor.FailoverExecuteReader(DbCommand command, Func`1 func) at Terrasoft.Core.DB.DBExecutor.ExecuteCommand[TResult](Func`2 commandExecutionCallback, String sqlText, QueryParameterCollection queryParameters, CancellationToken cancellationToken) 
at Terrasoft.Core.DB.DBExecutor.InternalExecuteReader(String sqlText, QueryParameterCollection queryParameters, CommandBehavior behavior, CancellationToken cancellationToken) at Terrasoft.DB.PostgreSql.PostgreSqlExecutor.InternalExecuteReader(String sqlText, QueryParameterCollection queryParameters, CommandBehavior behavior, CancellationToken cancellationToken) at Terrasoft.Core.DB.DBExecutor.InternalExecuteReader(String sqlText, QueryParameterCollection queryParameters) at Terrasoft.Configuration.VisaHelper.GetVisaData(Select entitiesSelect) at Terrasoft.Configuration.VisaHelper.GetEntities(RequestOptions requestOptions) at SyncInvokeGetVisaEntities(Object , Object[] , Object[] ) 
at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

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

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

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

Нравится

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

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

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



Дополнено:

В методе GetEntitiesSelect

Должно работать при таком наборе колонок (на разных версиях возможно может быть больше/меньше):

Id","CreatedOn","CreatedById","ModifiedOn","ModifiedById","ProcessListeners","Objective","VisaOwnerId","IsAllowedToDelegate","DelegatedFromId","StatusId","SetById","SetDate","IsCanceled","Comment","VisaSchemaName","Title","VisaObjectId","Date","Account","Contact","VisaSchemaTypeId","VisaTypeName","VisaSchemaCaption","SchemaName","ImageId".



В методе AddColumns

"Id","Objective","StatusId","IsCanceled","SysAdminUnitId","VisaSchemaName","VisaObjectId","Account","Contact","SchemaName","ImageId"



И 

public override void SetColumns(List<string> columns) {

            columns.Add("Id");

            columns.Add("Title");

            columns.Add("Date");

            columns.Add("Account");

            columns.Add("Contact");

            columns.Add("VisaObjectId");

            columns.Add("SchemaName");

            columns.Add("ImageId");

        }

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

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



Дополнено:

В методе GetEntitiesSelect

Должно работать при таком наборе колонок (на разных версиях возможно может быть больше/меньше):

Id","CreatedOn","CreatedById","ModifiedOn","ModifiedById","ProcessListeners","Objective","VisaOwnerId","IsAllowedToDelegate","DelegatedFromId","StatusId","SetById","SetDate","IsCanceled","Comment","VisaSchemaName","Title","VisaObjectId","Date","Account","Contact","VisaSchemaTypeId","VisaTypeName","VisaSchemaCaption","SchemaName","ImageId".



В методе AddColumns

"Id","Objective","StatusId","IsCanceled","SysAdminUnitId","VisaSchemaName","VisaObjectId","Account","Contact","SchemaName","ImageId"



И 

public override void SetColumns(List<string> columns) {

            columns.Add("Id");

            columns.Add("Title");

            columns.Add("Date");

            columns.Add("Account");

            columns.Add("Contact");

            columns.Add("VisaObjectId");

            columns.Add("SchemaName");

            columns.Add("ImageId");

        }

Литвинко Павел,

Подскажите,

1) базовый - это BaseVisaNotificationProvider? 

2) должна ли быть запись для нового раздела Opportunity в таблице "NotificationProvider" ?

3) нужно ли добавлять копии БП по подобию "OrderVisaBaseSubprocess", 

"OrderVisaBaseSubprocessOrder1",

"OrderVisaBaseProcess",

"OrderVisaBaseProcessOrder1" ?

 

Литвинко Павел,

Спасибо, починил! Отличие было в другом разделе.

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

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

Подскажите как реализовать стандартном БП отправку утвержденной визы в другой отдел.

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

Спасибо!

Нравится

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

Если виза создаётся в процессе, то после её завершения можно поставить следующий элемент - отправку письма. 

 

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

Добрый день!

мы хотим проверить на вашу тестовом ПО веб приложения проверить как работать по транспортном услуги Карго работы для грузоперевозки!

Используйте low code средства платформы.

Если виза создаётся в процессе, то после её завершения можно поставить следующий элемент - отправку письма. 

 

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

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

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

Вопрос не о том, как исправить эту ошибку. Интересно бы повторить логику элемента Визирование на основе базовых элементов чтения/записи.

Элемент визирования работает так:

  • В системе создается новая виза. Вся информация по визе, например, визирующий, результат визирования, комментарии и т. д., отображается на вкладке [ Визы ] записи раздела, по которой запущен кейс. 
  • Email-уведомление о необходимости визирования отправляется в момент создания визы сотруднику или группе сотрудников, которые назначены визирующими.
  • После утверждения или отклонения визы выбранному сотруднику, который заинтересован в результате визирования, отправляется email-уведомление и выполняется переход на следующую стадию кейса.

Где посмотреть в коде механизм логики работы элемента визирования? Может быть логика у вас есть в виде какой-нибудь диаграммы? Может быть базовый элемент визирования кто-нибудь успешно дублировал сам?

Нравится

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

Там очень странная логика - надо указать роль или конкретного пользователя.   В элементе визирования тип Approver'а важен (хотя, данные в любом случае берутся из System Administration Object) и самого пользователя надо читать из Users (view)



Мы в итоге сделали так:

Там очень странная логика - надо указать роль или конкретного пользователя.   В элементе визирования тип Approver'а важен (хотя, данные в любом случае берутся из System Administration Object) и самого пользователя надо читать из Users (view)



Мы в итоге сделали так:

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

Добрый день, коллеги. Необходимо добавить кнопку на панель визирования (помимо approve и reject).

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

Нравится

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

Замещать как и расширять модули можно, если делать это правильно.

Вот пример замещения модуля BaseCommunicationViewModel.

Создаем новый модуль, в данном случае будем замещать (override, можно использовать расширение extend(вместо override заменить)). Затем, где нужно, вызываете реализованный вами модуль.

Например в детали: 

define("AppFormCommunicationDetail", ["ScBaseCommunicationViewModel"],



Реализация модуля:

define("ScBaseCommunicationViewModel", ["BaseCommunicationViewModel"],
function() {
	Ext.define("Terrasoft.ScBaseCommunicationViewModel", {
		override: "Terrasoft.BaseCommunicationViewModel",
		alternateClassName: "Terrasoft.ScBaseCommunicationViewModel",
		getLinkUrl: function(value) {
			//нужная реализация метода
		}
	});
	return Terrasoft.ScBaseCommunicationViewModel;
});

 

Замещать как и расширять модули можно, если делать это правильно.

Вот пример замещения модуля BaseCommunicationViewModel.

Создаем новый модуль, в данном случае будем замещать (override, можно использовать расширение extend(вместо override заменить)). Затем, где нужно, вызываете реализованный вами модуль.

Например в детали: 

define("AppFormCommunicationDetail", ["ScBaseCommunicationViewModel"],



Реализация модуля:

define("ScBaseCommunicationViewModel", ["BaseCommunicationViewModel"],
function() {
	Ext.define("Terrasoft.ScBaseCommunicationViewModel", {
		override: "Terrasoft.BaseCommunicationViewModel",
		alternateClassName: "Terrasoft.ScBaseCommunicationViewModel",
		getLinkUrl: function(value) {
			//нужная реализация метода
		}
	});
	return Terrasoft.ScBaseCommunicationViewModel;
});

 

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